柒.1.5 发布-订阅模式
最高频使用和被问到的设计模式,没有之一
柒.1.5.1 什么是发布-订阅模式
举个例子
作为前端工程师的你很关心前端技术,会经常去刷笔者的公众号学习。这样有了新文章你不会第一时间知道;要是忘了刷,过段时间新文章被挤下去之后,你再回来刷,就会可能错过了这篇文章;你要一直保持刷的姿势,很累的。换个轻松点的姿势,你选择了关注笔者的公众号,一有新的文章发布,公众号就会发消息到你的手机通知到你,从此你再也不会错过新文章,新松获取新知识。
定义
发布-订阅模式其实是一种对象间一对多的依赖关系,当一个对象的状态发送改变时,所有依赖于它的对象都将得到状态改变的通知。
订阅者(Subscriber)把自己想订阅的事件注册(subscribe)到调度中心(Event Channel),当发布者(Publisher)发布该事件(publish event)到调度中心,也就是该事件触发时,由调度中心统一调用(fire event)订阅者注册到调度中心的处理逻辑代码。
柒.1.5.2 优缺点
优点
对象之间解耦
异步编程中,可以更松耦合的代码编写
缺点
创建订阅者本身要消耗一定的时间和内存
虽然可以弱化对象之间的联系,多个发布者和订阅者嵌套一起的时候,程序难以跟踪维护
柒.1.5.3 如何实现
发布-订阅模式的实现思路
创建一个对象;
在该对象上创建一个调度中心,实际上是一个缓存列表;
on 方法用来把函数 fn 都加到缓存列表中,也即订阅者注册事件到调度中心;
emit 方法取到 arguments 里第一个当做 event,根据 event 值去执行对应缓存列表中的函数(发布者发布事件到调度中心,调度中心处理代码);
off 方法可以根据 event 的值取消订阅;
once 方法只监听一次,调用完毕后删除缓存函数(订阅一次)。
JavaScript代码实现
柒.1.5.4 发布-订阅模式与观察者模式的区别
先看个图以便有个直观认识。
观察者模式
:观察者(Observer)直接订阅(Subscribe)主题(Subject),而当主题被激活的时候,会触发(Fire Event)观察者里的事件。
发布订阅模式
:订阅者(Subscriber)把自己想订阅的事件注册(Subscribe)到调度中心(Event Channel),当发布者(Publisher)发布该事件(Publish Event)到调度中心,也就是该事件触发时,由调度中心统一调度(Fire Event)订阅者注册到调度中心的处理代码。
差异
在观察者模式中,观察者是知道 Subject 的,Subject 一直保持对观察者进行记录。然而,在发布订阅模式中,发布者和订阅者不知道对方的存在。它们只有通过消息代理进行通信。
在发布订阅模式中,组件是松散耦合的,正好和观察者模式相反。
观察者模式大多数时候是同步的,比如当事件触发,Subject 就会去调用观察者的方法。而发布-订阅模式大多数时候是异步的(使用消息队列)。
观察者模式需要在单个应用程序地址空间中实现,而发布-订阅更像交叉应用模式。
最后更新于