你真的了解观察者模式和发布订阅模式?

“ 在学习或者工作中,你肯定听说过观察者模式和发布订阅模式,大部分的人都会将这两混为一谈,然而你真的了解它们吗?”

1. 观察者模式vs发布订阅模式

不得不说它们两看起来很相似,在之前我一直认为发布+订阅=观察者模式,即发布可以称为主题(Subject),订阅可以称为观察者(Observer)。但是从实现角度看其实是不同的。
首先先来看一下观察者模式和发布订阅模式的流程图,放一张在网上找到的图:

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

观察者模式和发布订阅模式流程图

(1)从上图可以看到观察者模式和发布订阅模式不同之处在于发布订阅模式中有一个第三方调度,它会将订阅者和发布者串联起来,并且会过滤、分配输入的消息(其实就是消息代理进行通信,和广播一样),即使发布者和订阅者不知道有对方的存在。而观察者模式中subject和observer完全是关联的,也就是Observer是知道Subject,并且Subject一直保持对Observer记录;
(2)观察者模式其实是为了实现松耦合,而发布订阅模式中,发布者和订阅者彼此互不认识,是通过第三者消息队列触发的,因此发布订阅模式是完全解耦的;
(3)观察者模式大部分是同步的(事件触发),而发布订阅模式大部分是异步的(消息队列);
(4)观察者模式多用于单个应用查询,发布订阅模式更多用于交叉应用程序。

2. 观察者模式和发布订阅模式的比方

观察者模式和发布者模式如果你还是觉得晦涩难懂,那么下面说几个比方可能更能帮你进行一个理解。
朋友圈:观察者模式其实就相当于你需要把消息群发给相关的人看,而发布订阅模式就相当于你把消息发到朋友圈,然后你朋友他们会刷新朋友圈看到你发的动态;

微博:你在微博上关注了某个明星A,然后其他人也同时关注了这个明星A,当A发布微博动态时,该微博就会为你们推送这条消息,在这里明星A就是发布者,而你就是订阅者,微博就是第三方组件调度中心(即你和明星A是没有直接接触的,都是通过微博来通知的);

快递:观察者模式相当于快递员送货上门,而发布订阅模式相当于增加了一个菜鸟驿站,然后快递员送到菜鸟驿站,而我们可以去菜鸟驿站取快递。

其实关于观察者模式和发布订阅模式的使用,还是取决于业务场景,如果你需要明确关心具体的数据源而不需要第三方的话,那么你就可以使用观察者模式;如果你不关心数据源来源于哪里,这个时候可以考虑到使用第三方,那么你就可以使用发布订阅模式。

下一篇会带领大家来写一下观察者模式和发布订阅模式的相关代码,以便更进一步的了解它们。

最后,感谢知乎和掘金上的几篇优质文章:
观察者模式 vs 发布-订阅模式
观察者模式 vs 发布订阅模式