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

我曾经在面试中被问道,_“观察者模式和发布订阅模式的有什么区别?” _我迅速回忆起“Head First设计模式”那本书:面试

发布 + 订阅 = 观察者模式设计模式

“我知道了,我知道了,别想骗我”异步

我微笑着回答:“没有区别,它们是同样的。”post

可是面试官笑了,“不,它们不同。”google

我当时的表情:设计

因此是我错了吗? 以后我回到家打开google查找答案。这篇文章就是我google后的总结。代理

在深刻探讨区别以前,咱们先来讨论下“观察者模式”和“发布订阅模式”。cdn

观察者设计模式:

我认为大多数人都会赞成观察者模式是学起来最好入门的,由于你从字面意思就能知道它主要是作什么的。server

观察者模式 在软件设计中是一个对象,维护一个依赖列表,当任何状态发生改变自动通知它们。对象

看吧,即便是维基百科的定义 ,也不是很难, 对吧? 若是你还不清楚,那让我用通俗易懂的来解释。

咱们假设你正在找一份软件工程师的工做,对“香蕉公司”很感兴趣。因此你联系了他们的HR,给了他你的联系电话。他保证若是有任何职位空缺都会通知你。这里还有几个候选人也你同样很感兴趣。因此职位空缺你们都会知道,若是你回应了他们的通知,他们就会联系你面试。

因此,以上和“观察者模式”有什么关系呢?这里的“香蕉公司”就是Subject,用来维护Observers(和你同样的候选人),为某些event(好比职位空缺)来**通知(notify)**观察者。

是否是很简单!?

因此,若是你想在你的软件或者应用中实现观察者模式,你能够遵循上图这个流程。(我不想在个人文章中写任何代码,由于网上有数不清的例子)

发布-订阅设计模式

在观察者模式中的Subject就像一个发布者(Publisher)观察者(Observer)彻底和订阅者(Subscriber)关联。subject通知观察者就像一个发布者通知他的订阅者。这也就是不少书和文章使用“发布-订阅”概念来解释观察者设计模式。可是这里还有另一个流行的模式叫作发布-订阅设计模式。它的概念和观察者模式很是相似。最大的区别是:

在发布-订阅模式,消息的发送方,叫作发布者(publishers),消息不会直接发送给特定的接收者,叫作订阅者

意思就是发布者和订阅者不知道对方的存在。须要一个第三方组件,叫作信息中介,它将订阅者和发布者串联起来,它过滤和分配全部输入的消息。换句话说,发布-订阅模式用来处理不一样系统组件的信息交流,即便这些组件不知道对方的存在。

那么如何过滤消息的呢?事实上这里有几个过程,最流行的方法是:基于主题以及基于内容。好了,就此打住,若是你感兴趣,能够去维基百科了解。

发布-订阅模式(图片来源: MSDN 博客)

因此,我用下图表示这两个模式最重要的区别:

图片来源: developers-club

有感受了吗?

咱们把这些差别快速总结一下:

  • 观察者模式中,观察者是知道Subject的,Subject一直保持对观察者进行记录。然而,在发布订阅模式中,发布者和订阅者不知道对方的存在。它们只有经过消息代理进行通讯。

  • 发布订阅模式中,组件是松散耦合的,正好和观察者模式相反。

  • 观察者模式大多数时候是同步的,好比当事件触发,Subject就会去调用观察者的方法。而发布-订阅模式大多数时候是异步的(使用消息队列)。

  • 观察者 模式须要在单个应用程序地址空间中实现,而发布-订阅更像交叉应用模式。

尽管它们之间有区别,但有些人可能会说发布-订阅模式是观察者模式的变异,由于它们概念上是类似的。

ok,我想说的说完了,但愿你get到了,感谢您的阅读,若是发现有什么错误或者须要修改的地方,请在下方留言,谢谢!

原文地址:https://hackernoon.com/observer-vs-pub-sub-pattern-50d3b27f838c 译者:缪宇

相关文章
相关标签/搜索