观察者模式(Observer Pattern)
观察者模式定义了对象间的一种一对一的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知,并自动更新。观察者模式属于行为型模式,行为型模式关注的是对象之间的通讯,观察者模式就是观察者和被观察者之间的通讯。
观察者模式有一个别名叫“发布-订阅模式”,或者说是“订阅-发布模式”,订阅者和订阅目标是联系在一起的,当订阅目标发生改变时,逐个通知订阅者。我们可以用报纸期刊的订阅来形象的说明,当你订阅了一份报纸,每天都会有一份最新的报纸送到你手上,有多少人订阅报纸,报社就会发多少份报纸,报社和订报纸的客户就是上面文章开头所说的“一对多”的依赖关系。
发布订阅模式(Pub-Sub Pattern)
其实24中基本设计模式中并没有发布订阅模式,它只是观察者模式的一个别称。
但经过时间的沉淀,似乎它已经强大了起来,已经独立于观察者模式,成为另外一种不同的设计模式。
现在的发布订阅模式中,称为发布者的消息发送者不会将消息直接发送给订阅者,这意味着发布者和订阅者不知道彼此的存在。在发布者和订阅者之间存在第三个组件,称为消息代理或调度中心或中间件,它维持着发布者和订阅者之间的联系,过滤所有发布者传入的消息并相应地分发它们给订阅者。
观察者模式和发布订阅模式有什么区别?
这两个模式的实现结构如下:
观察者模式:观察者(Observer)直接订阅(Subscribe)主题(Subject),而当主题被激活的时候,会触发(Fire Event)观察者里的事件。
发布订阅模式:订阅者(Subscriber)把自己想订阅的事件注册(Subscribe)到调度中心(Topic),当发布者(Publisher)发布该事件(Publish topic)到调度中心,也就是该事件触发时,由调度中心统一调度(Fire Event)订阅者注册到调度中心的处理代码。
注:参见笔记“理解VUE双向数据绑定原理和实现”的练习代码
在实现model-->view 的过程中,数据模型就是订阅目标,各处用到model的节点就是订阅者,其中实现的Dep就是消息代理中心,set方法是发布动作(其中调用消息代理中心Dep的notify方法就是发布动作),get方法是订阅动作(其中调用消息代理中心Dep的addSub方法就是订阅动作)。当订阅目标(数据模型model)发生变化时,Dep(消息代理中心)接收到发布,就会分发给各个订阅者(view)。