发布-订阅模式,看似陌生,其实不然。工作中经常会用到,例如 Node.js EventEmitter 中的 on 和 emit 方法;Vue 中的 on 和 emit 方法。...上面一个看似简单的操作,其实是一个典型的发布订阅模式,公众号属于发布者,用户属于订阅者;用户将订阅公众号的事件注册到调度中心,公众号作为发布者,当有新文章发布时,公众号发布该事件到调度中心,调度中心会及时发消息告知用户...缺点 创建订阅者本身要消耗一定的时间和内存 虽然可以弱化对象之间的联系,多个发布者和订阅者嵌套一起的时候,程序难以跟踪维护 五、 扩展(发布-订阅模式与观察者模式的区别) 很多地方都说发布-订阅模式是观察者模式的别名...**发布订阅模式**:订阅者(Subscriber)把自己想订阅的事件注册(Subscribe)到调度中心(Event Channel),当发布者(Publisher)发布该事件(Publish Event...**差异**: 在观察者模式中,观察者是知道 Subject 的,Subject 一直保持对观察者进行记录。然而,在发布订阅模式中,发布者和订阅者不知道对方的存在。它们只有通过消息代理进行通信。
参考链接:https://github.com/shfshanyue/Daily-Question/issues/631#issuecomment-872726...
fns.splice(i, 1) } } } }, } // 定义一个inieEvent的函数 使得所有的对象 都有发布功能...event) { obj[i] = event[i] } } // 进行测试 var shopObj = {} initEvent(shopObj) // 小红订阅以下消息...(color, size) { console.log('小红你要得颜色是' + color) console.log('小红你要得尺码是' + size) }) // 小花订阅以下消息
发布订阅模式可以理解为: 用户关注一个了微信公众号(订阅),当公众号有内容更新时会推送(发布)给所有关注该公众号的用户。...废话不多说直接上代码(此demo仅帮助理解发布/订阅模式): let Observable = { observers:[], // 订阅者集合 addObserver:function...(index,1); } }, notifyObservers:function (message) { // 向订阅者发布消息 for(let i =...Observable.addObserver(observer1); Observable.addObserver(observer2); Observable.addObserver(observer3); // 向订阅者发布...1---------hello 2---------hello 3---------hello 2---------test 3---------test 发布者
# EventEmit export default class EventEmitter { constructor () { this.even...
观察者模式属于行为型模式,行为型模式关注的是对象之间的通讯,观察者模式就是观察者和被观察者之间的通讯。 优点: 1.观察者和被观察者是耦合的。...2.如果观察者和观察者目标有循环引用的化,观察者目标会循环调用,可能导致系统崩溃 3.观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么变化的,而是仅仅知道观察者目标发生了变化。...发布订阅模式 定义 发布订阅模式基于观察者模式,他只是观察者模式的一个别称。 但是经过时间的沉淀,似乎他已经强大了起来,已经独立于观察者模式,成为另外一种不同的设计模式。...在现在的发布订阅模式中,称为发布者的消息发送者不会将消息直接发送给订阅者,这意味着发布者和订阅者不知道彼此的存在。...在发布者和订阅者之间存在第三个组件,称为消息代理或调度中心或中间件,它维持着发布者和订阅者之间的联系,过滤所有发布者传入的消息并相应地分发它们给订阅者
发布订阅者模式是其中的一种思想,是对显示中的一种场景的抽象,常见的场景有微信公众号订阅,朋友圈推送,群消息推送等,都或多或少用了这种设计模式。...发布订阅者模式发布订阅者模式又称为观察者模式,对象的大概关系如下:其中涉及四个对象:我们简单来看一下其中各个对象的意义。...那我想,如果有人订阅了我的公众号,但是这个人每次发布文章都会来杠一下,我把他拉黑了,那么他虽然订阅了我的公众号,我还是不会给他发送通知,所以我们是不是订阅者有各种各样的类型。...订阅者的接口已经定义好了,然后就是发布者的一个定义。...};至此,一个简单的公众号的订阅和发布者模式就实现好了,总体来说比较简单。
发布订阅模式(Publish/Subscribe Pattern): 起初发布订阅模式也叫观察者模式的别名,慢慢的独立成一个不同的设计模式。...订阅者把想订阅的事件注册到中间代理,发布者发布事件到中间代理,由中间代理统一发送给订阅者。 观察者模式的观察者相当于发布订阅模式的订阅者,两者的最大区别就是发布订阅模式有了一个中间机制。...而发布订阅模式不需要有任何关联,是完全解耦的,都是通过中间机制进行通信,两者是完全分离的,所以也是异步实现。...:用户3 //用户2订阅了:用户3 //用户3发布了一条消息 //订阅了用户3的用户1收到了这条消息 //订阅了用户3的用户2收到了这条消息 这就是观察者模式,观察者关联了目标对象(user3),当目标对象发布消息的时候...对于观察者模式和发布订阅模式大概就理解到这样的程度了,至于怎么在编程中使用,就有待商榷了。 (完)
常听到 "观察者模式 vs 发布/订阅模式", 两者分别如何设计,有何不同,请看下文^_^ 01 单词解析 观察者模式 Observer : 观察者 Subject: 主题 Subscribe...: 订阅 Fire Event: 触发事件 发布订阅模式 Publisher: 发布者 Subscriber: 订阅者 Event Channel: 事件通道(或调度中心)...Subscriber: 订阅 Fire Event : 触发事件 Publish topic :发布主题 Topic: 主题 02 观察者模式 vs 发布/订阅模式 观察者模式: 观察者(Observer...发布订阅模式: 订阅者(Subscriber)把自己想订阅的事件注册(Subscribe)到调度中心(Topic),当发布者(Publisher)发布该事件(Publish topic)到调度中心,也就是该事件触发时...两者区别: 发布/订阅模式多了一个调度中心 03 示例代码 观察者模式 Subject(主题) // 宝宝 class Subject{ constructor(name) {
发布订阅模式 大概很多人都和我一样,觉得发布订阅模式里的Publisher,就是观察者模式里的Subject,而Subscriber,就是Observer。...在发布订阅模式里,发布者,并不会直接通知订阅者,换句话说,发布者和订阅者,彼此互不相识。 互不相识?那他们之间如何交流? 答案是,通过第三者,也就是在消息队列里面,我们常说的经纪人Broker。 ?...发布者只需告诉Broker,我要发的消息,topic是AAA; 订阅者只需告诉Broker,我要订阅topic是AAA的消息; 于是,当Broker收到发布者发过来消息,并且topic是AAA时,就会把消息推送给订阅了...当然也有可能是订阅者自己过来拉取,看具体实现。 也就是说,发布订阅模式里,发布者和订阅者,不是松耦合,而是完全解耦的。 放一张极简的图,给大家对比一下这两个模式的区别: ?...总结 从表面上看: 观察者模式里,只有两个角色 —— 观察者 + 被观察者 而发布订阅模式里,却不仅仅只有发布者和订阅者两个角色,还有一个经常被我们忽略的 —— 经纪人Broker 往更深层次讲: 观察者和被观察者
观察者模式有一个别名叫“发布-订阅模式”,或者说是“订阅-发布模式”,订阅者和订阅目标是联系在一起的,当订阅目标发生改变时,逐个通知订阅者。...在现在的发布订阅模式中,称为发布者的消息发送者不会将消息直接发送给订阅者,这意味着发布者和订阅者不知道彼此的存在。...在发布者和订阅者之间存在第三个组件,称为消息代理或调度中心或中间件,它维持着发布者和订阅者之间的联系,过滤所有发布者传入的消息并相应地分发它们给订阅者。...而发布订阅模式中统一由调度中心进行处理,订阅者和发布者互不干扰,消除了发布者和订阅者之间的依赖。这样一方面实现了解耦,还有就是可以实现更细粒度的一些控制。...观察者模式是不是发布订阅模式 网上关于这个问题的回答,出现了两极分化,有认为发布订阅模式就是观察者模式的,也有认为观察者模式和发布订阅模式是真不一样的。
1、生产者基类(父类) class BaseProducer(object): ''' 生产者 ''' def __init__(self,name):...初始化消费者对象 :param name:消费者名称 ''' self.name = name def action(self,object):...''' 消费者消费动作 :param object:消费物品 :return: ''' pass 3、根据业务模拟编写生产者消费者...__str__()) # 把生产的产品放到队列中 queue.put(list) # new 一个消费者 consumer = WebConsumer("消费者1")...5、总结 其实发布订阅者模式就是生产者消费者模式, 区别在于发布订阅者多了一个中间队列, 生产者生产产品,放到队列中,消费者从队列中取出产品消费。
定义 观察者模式也叫订阅-发布者模式,是一种一对一或者一对多的依赖关系,当一个对象改变状态,依赖它的对象会收到通知并自动更新。...观察者模式的结构 观察者模式主要由四个主要部分构成 (1)主题(Subject):主题也叫抽象被观察者,是一个接口,该接口规定了具体主题需要实现的方法,比如,添加、删除观察者以及通知观察者更新数据的抽象方法...(2)观察者(Observer):观察者是一个接口,该接口规定了具体观察者用来更新数据的方法。...具体主题需使用一个集合,比如ArrayList,存放观察者的引用,以便数据变化时及时通知具体观察者。...通俗点就是:主题发布信息,观察者获取信息,他们关联了就能收到信息,没有关联就收不到信息。 如图: ?
四、采用发布-订阅 估计读完这段代码,你也体会到了这个功能的实现是非常容易实现的。但是实际上,作为一个插件的标准来讲,这段代码是存在一些潜在的问题的,这些问题并不是逻辑上的问题,而是设计问题。...我们的具体做法就是采用发布-订阅模式。 发布—订阅模式又叫观察者模式,它定义对象间的一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知。...拿刚刚实现的功能来说,在对象创建的时候,我就开辟一个池子,将需要执行的方法放进这个池子,当鼠标按下的时候,我把池子里面的函数拿过来依次执行,对于鼠标松开就再创建一个池子,同理,这就是发布-订阅。...jQuery 里面有现成的发布订阅方法。...有了发布-订阅的场景,理解这个设计思想就更加容易了。其实你看在这个过程中,功能并没有添加多少,但是这波操作确实值得,因为它让整个代码更加的灵活。
1、观察者vs发布订阅 首先观察者跟发布订阅这两者虽然看起来很相似,但是两者是有差异的,至少从实现方式上就有差异。...其次,虽然两者有差异,但是说发布订阅模式是观察者模式的变异也是ok的,因为它们思想上是一致的。...观察者vs发布订阅 下面我们就用结合代码来捋一捋。...然而,在发布订阅模式中,发布者和订阅者不知道对方的存在。它们只有通过消息代理进行通信。 在发布订阅模式中,组件是松散耦合的,正好和观察者模式相反。...观察者模式大多数时候是同步的,比如当事件触发,Subject就会去调用观察者的方法。而发布-订阅模式大多数时候是异步的(使用消息队列)。
观察者模式和发布订阅模式有什么区别?...Pub-Sub Pattern 在“发布者-订阅者”模式中,称为发布者的消息发送者不会将消息编程为直接发送给称为订阅者的特定接收者。这意味着发布者和订阅者不知道彼此的存在。...存在第三个组件,称为代理或消息代理或事件总线,它由发布者和订阅者都知道,它过滤所有传入的消息并相应地分发它们。...然而,在发布者/订阅者中,发布者和订阅者不需要彼此了解。他们只是在消息队列或代理的帮助下进行通信。...另一方面,发布者/订阅者模式更像是跨应用程序模式。 尽管这些模式之间存在差异,但有些人可能会说发布者 - 订阅者模式是观察者模式的变体,因为它们之间存在概念上的相似性,但并不是一样的,欢迎拍砖!
,胖sir,你要是能给我讲讲基本的设计模式,我一会带你上分 胖sir淡定的推了推眼镜,说道:不就是上分嘛,有啥了不起的 兵长:悄悄告诉你,我是星耀~ 胖sir:我给你说说基本的单例模式,工程模式以及发布订阅模式...胖sir:那你要再带我赢一把 发布订阅模式与观察者模式 发布订阅模式和观察者模式是同一个东西吗?...NONONO 观察者模式里,只有两个角色 —— 观察者 + 被观察者 发布订阅模式里 —— 观察者 + 中间经纪人 +被观察者 观察者模式中的推模型和拉模型: 推模型: 目标对象主动向观察者推送目标的详细信息...string content) { for(auto &a : oblist){ a->update(content); } } //通知所有订阅者...setName("Bob"); reader * r3 = new reader(); r3->setName("ceilina"); //设置内容 //报纸开始加入订阅者
Java设计模式-观察者模式(订阅发布模式) 一起来看 会了就当复习丫,不会来一起来看看吧。 很喜欢一句话:“八小时内谋生活,八小时外谋发展”。 如果你也喜欢,让我们一起坚持吧!!...这种模式有时又称作发布-订阅模式、模型-视图模式,它是对象行为型模式。...name + "-" + message); } } 定义抽象主题类,提供了attach、detach、notify三个方法 public interface Subject { //增加订阅者...//通知订阅者更新消息 public void notify(String message); } 微信公众号是具体主题(具体被观察者),里面存储了订阅该公众号的微信用户,并实现了抽象主题中的方法...*/ } } 微信公众号一发消息,所有订阅的用户都能接收到。 之前写过一篇 SpringBoot整合Redis实现发布/订阅模式 的文章。大家感兴趣可以看一看哈!!!
文章目录 一、发布订阅模式 二、订阅频道 三、发布消息 四、接收消息 一、发布订阅模式 ---- Redis 中 存在一种 发布订阅 消息通信模式 : 消息发布者 : 负责发送消息 , 订阅者需要订阅该发布者频道...; 消息订阅者 : 负责接收消息 ; 订阅者 先 订阅 发布者频道 , 当 发布者 发布消息时 , 订阅者 会接收到该信息 ; 在 Redis 中 , 发布者 是 消息频道 , 订阅者 是 Redis...客户端 ; 一个 Redis 客户端可以 订阅多个 消息频道 ; 一个 消息频道 可以 被多个 Redis 客户端 订阅 ; 当 消息频道 发送消息后 , 订阅该频道的 客户端 , 就会收到该频道发送的消息...; 二、订阅频道 ---- 订阅频道 : 在一个命令行中 , 执行 subscribe channel1 命令 , 可以 订阅 名称为 channel1 的 消息频道 ; 上述命令执行后 , 在命令行中会...(press Ctrl-C to quit) 1) "subscribe" 2) "channel1" 3) (integer) 1 三、发布消息 ---- 重新打开一个 CMD 命令行工具 , 执行
领取专属 10元无门槛券
手把手带您无忧上云