发布订阅模式与观察者模式

观察者模式和与发布订阅模式的区别 这两天面试问到了这个问题,下来就重点学习了一下1.观察者模式:在软件设计中是一个对象,维护一个依赖列表,当任何状态发生改变自动通知它们。举个例子:假设我正在找一份软件工程师的工作,对“XX公司”很感兴趣。所以我就联系了他们的HR,给了他我的联系电话。他保证如果有任何职位空缺都会通知你。这里还有几个候选人也你一样很感兴趣。所以职位空缺大家都会知道,如果你回应了他们的通知,他们就会联系你面试。所以,以... 阅读详情

一、概念

观察者模式(Observer Pattern):观察者模式定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知,并自动更新。观察者模式属于行为型模式,行为型模式关注的是对象之间的通讯,观察者模式就是观察者和被观察者之间的通讯。

观察者模式有一个别名叫“发布-订阅模式”

发布订阅模式(Pub-Sub Pattern):经过时间的沉淀,已经独立于观察者模式,成为另外一种不同的设计模式。

称为发布者的消息发送者不会将消息直接发送给订阅者,这意味着发布者和订阅者不知道彼此的存在。在发布者和订阅者之间存在第三个组件,称为消息代理或调度中心或中间件,它维持着发布者和订阅者之间的联系,过滤所有发布者传入的消息并相应地分发它们给订阅者。

二、实现结构

三、代码实现

观察者模式

 //有一家猎人工会,其中每个猎人都具有发布任务(publish),订阅任务(subscribe)的功能
  //他们都有一个订阅列表来记录谁订阅了自己

  //定义一个猎人类,包括姓名,级别,订阅列表
  function Hunter(name, level){
    this.name = name;
    this.level = level;
    this.list = [];
  }

  //发布任务的功能
  Hunter.prototype.publish= function (parameters){
      var money = parameters.money;
      console.log(this.level + '猎人' + this.name + '寻求帮助')
      this.list.forEach(function (item, index){
              item(money)
          })
    };

  //订阅任务(subscribe)的功能
  Hunter.prototype.subscribe = function (targrt, fn){
    console.log(this.level + '猎人' + this.name + '订阅了' + targrt.name)
      targrt.list.push(fn)
    }

  //猎人工会的几个猎人

  let hunterMing = new Hunter('小明', '黄金')
  let hunterJin = new Hunter('小金', '白银')
  let hunterZhang = new Hunter('小张', '黄金')
  let hunterPeter = new Hunter('Peter', '青铜')

  //Peter等级较低,可能需要帮助,所以小明,小金,小张都订阅了Peter
  hunterMing.subscribe(hunterPeter, function (money){
        console.log('小明表示:' + (money > 200) ? '' : '暂时很忙,不能'+ '给予帮助')
      })
  hunterJin.subscribe(hunterPeter, function (){
        console.log('小金表示:给予帮助')
      })

  hunterZhang.subscribe(hunterPeter, function (){
        console.log('小张表示:给予帮助')
      })

  //Peter遇到困难,赏金198寻求帮助
  hunterPeter.publish({money: 198})
  //猎人们(观察者)关联他们感兴趣的猎人(目标对象),如Peter,当Peter有困难时,会自动通知给他们(观察者)

分析:

item(money)

主要是这个函数,来进行通知订阅者。

发布-订阅模式

  //主要功能包括任务发布大厅(topics),以及订阅任务(subscribe),发布任务(publish)
  let HunterUnion = {type: 'hunt',
        topics: Object.create(null),
       subscribe: function (topic, fn){
            if (!this.topics[topic]){
              this.topics[topic] = [];
            }
           this.topics[topic].push(fn);
            },
        publish: function (topic, money){
            if (!this.topics[topic])
              return;
            for (let fn of this.topics[topic]){
              fn(money)
            }
          }
      }

  //定义一个猎人类 包括姓名,级别
  function Hunter(name, level){
    this.name = name;
    this.level = level;
  }

  //猎人可在猎人工会发布订阅任务
  Hunter.prototype.subscribe = function (topic,fn){
      console.log(this.level + '猎人' + this.name + '订阅了狩猎' +topic + '的任务')
      HunterUnion.subscribe(topic, fn)
    }

  Hunter.prototype.publish = function (topic, money){
      console.log(this.level+ '猎人' + this.name + '发布了狩猎' + topic + '的任务')
      HunterUnion.publish(topic,money)
  }

  //猎人工会走来了几个猎人
   let hunterMing = new Hunter('小明', '黄金')
   let hunterJin = new Hunter('小金', '白银')
   let hunterZhang = new Hunter('小张', '黄金')
  let hunterPeter = new Hunter('Peter', '青铜')


  //小明,小金,小张分别订阅了狩猎tiger的任务
  hunterMing.subscribe('tiger', function (money){
        console.log('小明表示:' + (money > 200 ? '' : '不') + '接取任务')
      })
  hunterJin.subscribe('tiger', function (money){
    console.log('小金表示:接取任务')
  })
  hunterZhang.subscribe('tiger', function (money){
    console.log('小张表示:接取任务')
  })

  //Peter订阅了狩猎sheep的任务
  hunterPeter.subscribe('sheep', function (money){
        console.log('Peter表示:接取任务')
      })
  
  //Peter发布了狩猎tiger的任务
  hunterPeter.publish('tiger', 298)
  //猎人们发布(发布者)或订阅(观察者/订阅者)任务都是通过猎人工会(调度中心)关联起来的,他们没有直接的交流。

四、总结

观察者模式和发布订阅模式最大的区别就是发布订阅模式有个事件调度中心。

观察者模式由具体目标调度,每个被订阅的目标里面都需要有对观察者的处理,这种处理方式比较直接粗暴,但是会造成代码的冗余。

而发布订阅模式中统一由调度中心进行处理,订阅者和发布者互不干扰,消除了发布者和订阅者之间的依赖。这样一方面实现了解耦,还有就是可以实现更细粒度的一些控制。比如发布者发布了很多消息,但是不想所有的订阅者都接收到,就可以在调度中心做一些处理,类似于权限控制之类的。还可以做一些节流操作。

观察者模式和发布订阅模式区别与实现 备注:本文所有代码采用ES6书写。 什么是观察者模式? 观察者模式是软件设计模式的一种。在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。 以上是维基百科对于观察者模式的定义。其实上面这段话不难理解,打个比方。双十一之前,你看上了一个腿打折的商品需要预约,系统会在双十一的时候提醒所有点了预约的用户来抢货。 我们来解析一下这个过程。系统就可以看做是目标... 阅读详情

相关推荐

【设计模式】如何用C++实现观察者模式【发布订阅机制】

观察者模式(Observer Pattern)是一种常见的设计模式,属于**行为型模式**。它定义了一种**一对多的依赖关系**,使得当一个对象的状态发生改变时,其所有依赖对象(观察者)都会自动收到通知并更新。这种模式常用于事件驱动的系统。

zhangjiuding的博客 1524

观察者模式与订阅发布模式的区别

1、观察者模式 观察者模式定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知,并自动更新。观察者模式属于行为型模式,行为型模式关注的是对象之间的通讯,观察者模式就是观察者和被观察者之间的通讯。 观察者模式有一个别名叫“发布-订阅模式”,或者说是“订阅-发布模式”,订阅者和订阅目标是联系在一起的,当订阅目标发生改变时,逐个通知订阅者。我们可以...

dkjtyhj3671的博客 874

老服务器焕新记:在Dell R730上折腾Nvidia K80显卡的完整记录(含Anaconda环境配置)

本文详细记录了在Dell R730服务器上为Nvidia K80计算卡安装驱动、配置CUDA及Anaconda环境的完整过程。文章重点解决了老旧硬件与CentOS 7系统的兼容性问题,提供了从BIOS设置、驱动版本精准匹配到Python机器学习环境搭建的实战指南,旨在帮助读者低成本挖掘旧服务器的GPU计算潜力。

weixin_29197835的博客 504

观察者模式和发布订阅模式的区别

发布订阅模式的原理基于消息队列或主题,发布者将消息发布到特定的消息队列或主题中,而订阅者可以订阅这些消息队列或主题以接收和处理消息。发布者和订阅者之间的通信是异步的,这意味着发布者发布消息后,订阅者可以在任何时候接收和处理消息。发布订阅模式的核心思想是将发布者和订阅者解耦,使得它们可以独立地运行和扩展。这种解耦有助于提高系统的灵活性和可伸缩性,因为发布者和订阅者可以根据需要进行扩展和修改,而不会影响彼此的操作。发布订阅模式在许多领域都有应用,如消息队列事件驱动架构实时数据更新消息推送。

weixin_68266812的博客 3621

海康威视SADP SDK实战:5分钟搞定局域网设备搜索(附C++代码示例)

本文详细解析了海康威视SADP SDK在局域网设备搜索中的高效应用,通过C++代码示例展示如何快速实现设备发现与信息获取。SADP协议支持全面设备信息采集和实时状态更新,适用于智能安防和物联网管理场景,帮助开发者5分钟内完成设备搜索功能集成。

rum55的博客 874

黑群晖断电后存储池‘已损毁’?别慌,SSH里这几条命令能救急

本文详细解析黑群晖断电后存储池显示‘已损毁’的紧急修复方法。通过SSH命令行工具,提供从诊断到修复的完整流程,包括RAID阵列重新组装、设备重建等关键步骤,帮助用户恢复数据访问。适用于因意外断电导致的存储池异常情况。

weixin_42651748的博客 376

【设计模式】发布订阅模式和观察者模式实现和区别

我总感觉这两个是一个东西,老是傻傻分不清楚,在写 vue 项目中的时候我们常用的还是发布订阅模式,比如使用事件总线 eventBus 就是发布订阅模式。发布者和订阅者之间没有直接的联系。个主题可以有多个观察者。

有一棵树的博客 1015

使用Gromacs进行蛋白和配体小分子的动力学模拟+结果分析全流程教程

先选protein,选择non-water,使用pymol打开delWater.pdb,输入util.ss('all')展示cartoon,点击file-Export Moive as-MPEG。这一步完成后,文件夹中会出现以下三个文件,其中gro 文件用于记录蛋白的初始坐标,top 文件记录蛋白的拓扑信息和力场信息,itp 与top文件类似。接下来使用Spdbv软件打开蛋白,如果蛋白中存在原子缺失情况,就会出现以下的提示,如果不存在就不会显示,同时保存为rep.pdb。

weixin_46587777的博客 2854

观察者模式和发布订阅模式

观察者(Observer),又称发布-订阅(Publish-Subscrice),属于23中设计模式之一。发布订阅模式定义了一种一对多的依赖关系,让多个订阅者对象同时监听某一个主题对象。这个主题对象在自身状态变化时,会通知所有订阅者对象,使它们能够自动更新自己的状态。

三冬暖 3103

基于smart_rtmp直播,最简单的部署手册

版本号 添加内容 修改时间 V1.0 新建 2021年12月30日 V1.1 增加网页播放 2021年12月31日 V1.2 增加是否可以多流和测试数据 2022年1月5日 目录 一、软件储备 1.推流软件:OBS 2.服务器流媒体软件:smart_rtmp 3.播放软件:Pot...

qq_28768477的博客 1万+

RK3588内核崩溃日志捕获:pstore与ramoops的实战配置指南

本文详细介绍了在RK3588嵌入式设备上配置pstore与ramoops以捕获内核崩溃日志的实战指南。通过内核配置调整、设备树设置及高级调试技巧,帮助开发者有效定位系统崩溃原因,特别适合户外智能设备等无法长期连接调试器的场景。文章还提供了生产环境优化建议,确保日志捕获的可靠性与安全性。

weixin_29189363的博客 407

EventBus—思考观察者模式与发布订阅者模式

EventBus系列文章: EventBus—使用实践 EventBus—源码解析 1. 概述 在EventBus的学习当中,EventBus是基于发布订阅者模式的消息处理框架。 EventBus is an open-source library for Android and Java using the publisher/subscriber pattern for loose co...

PPLLiang的博客 2104

Vivado加上VsCode让你的生活更美好

VsCode与Vivado的灵活使用 引言 ​ 现在大二了,在接触硬件描述语言。Vivado自带的编辑器实在很难用,为了能够“极客”一些,当然是去Google了一下有哪些方法可以取而代之。 ​ 网络上的答案大同小异,基本上都是用的Sublime Text.(我的学长们也几乎都是) 平时码代码的过程中,我习惯与使用VsCode,尤其是在微软收购GitHub之后,Code 简直就是神器了。于是乎…一个...

qq_39498701的博客 10万+

从Vue层面 - 解析发布订阅模式和观察者模式区别

观察者模式和发布订阅模式作为日常开发中经常使用到的模式,我一直不能做到很好的区分。最近在看Vue的源码,里面设计到了观察者模式,比较感兴趣,就去学习了下,这里做个总结吧。

铁锤妹妹的博客 4241

移远EC800M CAT1模块HTTP POST实战:从AT指令到数据上报的完整避坑指南

本文详细介绍了移远EC800M CAT1模块通过AT指令实现HTTP POST数据上报的完整开发流程,包括模块初始化、PDP上下文配置、HTTP POST实现及优化策略。针对实际开发中的常见问题如网络异常、低功耗需求等提供了经过验证的解决方案,帮助开发者快速实现稳定可靠的物联网数据传输功能。

weixin_42556197的博客 481

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

发布订阅者模式和观察者模式的区别

发布订阅者模式和观察者模式的区别 1.什么是观察者模式 定义:当对象之间存在一对多的依赖关系时,其中一个对象的状态发生改变,所有依赖它的对象都会收到通知,这就是观察者模式。 在观察者模式中,只有两种主体:目标对象 (`Object`) 和 观察者 (`Observer`)。 目标对象 `Subject`: - 维护观察者列表 `observerList` - 定义添加观察者的方法 - 当自身发生变化后,通过调用自己的 `notify` 方法依次通知每个观察者执行 `update` 方法 观察者 Obs

qq_45803050的博客 5346

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

观察者模式VS发布订阅模式区别

比如发布者发布了很多消息,但是不想所有的订阅者都接收到,就可以在调度中心做一些处理,类似于权限控制之类的。观察者模式: 观察者(Observer)直接订阅(Subscribe)主题(Subject),而当主题被激活的时候,会触发(Fire Event)观察者里的事件。以意图来分辨模式,都是实现了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知,并自动更新,那么他们就是同一种模式;观察者模式由具体目标调度,每个被订阅的目标里面都需要有对观察者的处理,会造成代码的冗余。

最爱松露巧克力 2777

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

观察者模式 vs 发布订阅模式

有一回面试,面试官问: 观察者模式,和发布订阅模式,有什么区别? 我脑海中立刻闪现了《Head First设计模式》里讲的: Publishers + Subscribers = Observer Pattern “哼哼,我知道答案了,兄dei!”,我内心无比鸡冻。 “它们是一样的。”,我故作镇定,嘴角露出一丝微笑,仿佛下一秒钟面试官就会给我发offer。 面试官也笑了,“不,它们不一样”。 然后我就: So, 为什么我错了?观察者模式(Observer pattern),和发布订阅模式(Pu

天心天地生的博客 349

发布订阅模式和观察者模式区别

一 观察者模式 观察者模式定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知,并自动更新。观察者模式属于行为型模式,行为型模式关注的是对象之间的通讯,观察者模式就是观察者和被观察者之间的通讯。 二 发布订阅模式 三 观察者模式与发布订阅模式区别 四 观察者模式与发布订阅模式优缺点 ...

sky_100的博客 828

观察者模式与发布订阅模式

观察者模式与发布订阅模式

weixin_44258574的博客 1863

JavaScript 发布订阅者模式和观察者模式及区别

发布订阅模式其实是一种对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到状态改变的通知。多方订阅,一方发布,订阅放会收到通知举例:教学楼中每个教室都有一个广播器,例如甲同学进入了A教室,甲同学可以理解为订阅,A教室有着A教室的订阅者,当校长只对A教室的广播进行播放时,只有A教室的所有学生可以受到广播信息。常见的发布订阅比如 Vue中js实现一个发布订阅我们发现每次进行订阅、通知都是在使用events中的 clientList, 并不会直接用$on 和 $emit 发生关系。

^_^ 1305

发布订阅模式vs观察者模式

背景 最近在研究react的状态管理器zustand时,研究源码时发现其组件注册绑定是通过观察者模式结合react hooks实现更新的。而联想之前写vue的时候,经常会用到vue内置的自定义事件进行组件通信($emit/on),这个应该是发布订阅模式,搞得我有点头大,感觉这两种模式又十分相似,自己也是有点迷糊,感觉没有理解透,因此,这次就顺势深入研究下这两种模式,再尝试自己手写实现加深下理解。这篇文章是我个人的梳理心得,如有错误欢迎指正,共同进步~ 对比 区别 观察者模式:在软件设计中是一个对象,维护一

小帅の技术博客 860
上一篇: TDD介绍与demo练习
下一篇: 函数式编程
flying_huixia
博客等级 码龄9年 76粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值