观察者模式和发布-订阅模式到底有没有区别?
在很多资料和书籍中,他们两者是相等的,但事实真是这样吗?
首先看一下观察者模式:
是一个对象,维护一个依赖列表,当状态发生改变时,会自动通知它们
来自维基百科的定义
这就好比:你对 Google 的某个职位很感兴趣,但该职位目前已经没有空缺,于是你给 HR 留下了你的电话,HR 保证当职位空缺时会通知你。同时对这个职位感兴趣的候选人还有成百上千个,所以当职位空缺大家都会知道,如果你回应了 HR 的通知,HR 就会联系你进行面试。
角色对比:Google 公司就是一个 Subject 对象,维护了 Observers (像你一样的候选人列表),当状态改变(职位空缺)就会 notify 候选人
See the Pen Observer Pattern by 286810 (@286810) on CodePen.
然后看一下发布-订阅模式:
消息的发送方叫发布者(publisher),消息不会直接发送给特定的订阅者(subscriber)
意思就是发布者和订阅者不知道对方的存在。需要一个第三方组件,叫做信息中介,它将订阅者和发布者串联起来,它过滤和分配所有输入的消息。
来源: MSDN 博客
最后,看一下对比图:
来源: developers-club
总结:
-
在观察者模式中,Observers(观察者)是知道Subject的,Subject一直保持对Observers(观察者)进行记录。然而,在发布订阅模式中,Publisher(发布者)和Subscriber(订阅者)不知道对方的存在。它们只有通过消息队列进行通信。
-
在发布订阅模式中,组件是低耦合的,正好和观察者模式相反。
-
观察者模式大多数时候是同步的,比如当事件触发,Subject就会去调用观察者的方法。而发布-订阅模式大多数时候是异步的(使用消息队列)。
-
观察者 模式需要在单个应用程序地址空间中实现,而发布-订阅更像交叉应用模式。
参考:https://hackernoon.com/observer-vs-pub-sub-pattern-50d3b27f838c