目录

观察者模式与订阅-发布模式的区别

有人说:“订阅-发布模式=观察者模式”,这么理解的人,是因为订阅-发布模式这个名字取的太简洁。

完整的解读订阅-发布模式,应该叫订阅-分发-发布模式

观察者模式涉及的角色:订阅者观察者目标;而订阅-分发-发布模式涉及的角色:订阅者发布者分发器。注意取名的不同表示他们执行的逻辑不同。

  • 订阅者:不用解释了。
  • 观察者:观察目标的状态,然后将结果告诉订阅者。
  • 目标:完全是群众演员。
  • 发布者:将自己的信息或状态告诉分发器,nothing more。
  • 分发器:将发布者告诉自己的信息转告给订阅者,so simple。

这么一说应该已经很明确了。各个角色的定位和逻辑是不同。由于逻辑和功能的不同,导致这两种模式的应用场景也不同。

我们用现实的例子来说明吧。

观察者模式

你在路上看到蚂蚁搬家,想知道它们什么时候搬完,但是又又不想一直这么无聊的盯。所以你找个小孩,给他一块糖,叫他帮你看,好了打电话告诉你。然后你就回寝室打农药了。

小孩就是观察者,蚂蚁搬家就是目标,你是订阅者。应用场景直观明了。

后来,你又看到一窝蚂蚁,只好又叫个小孩。因为职能必须唯一,当然我们不可以叫单个小孩一个人看两。

后来,又叫了个小孩……又叫了个小孩……又叫了个……

小孩多还不是麻烦,麻烦大的是,有一天,隔壁老王对这个小孩说,也通知我一下,隔壁老李对另一个小孩说,也通知我一下……

每个小孩要通知 100 个人,你等着 100 个小孩通知你。如果有 1000 个……10000 个……

订阅-发布模式

这个时候就要另一个模式出场了。有个孩子王还是很有头脑的。他对所有小孩说,你们看着蚂蚁搬家,有结果就告诉他。然后你对其它人说,谁想知道蚂蚁搬家最新进展的来我这里登记一下姓名、年龄、爱好和蚂蚁窝的编号。这时,小孩是发布者,孩子王是分发器,你和老王老李是订阅者

延伸

然后孩子王又给老王老李他们两种选择,一种是等他来打电话给老王老李,另一种是隔一段时间老王老李打电话找他问,这就是 push 和 pull 了。