观察者模式与订阅-发布模式的区别
目录
有人说:“订阅-发布模式
=观察者模式
”,这么理解的人,是因为订阅-发布模式
这个名字取的太简洁。
完整的解读订阅-发布模式
,应该叫订阅-分发-发布模式
。
观察者模式
涉及的角色:订阅者
、观察者
和目标
;而订阅-分发-发布模式
涉及的角色:订阅者
、发布者
和分发器
。注意取名的不同表示他们执行的逻辑不同。
订阅者
:不用解释了。观察者
:观察目标的状态,然后将结果告诉订阅者。目标
:完全是群众演员。发布者
:将自己的信息或状态告诉分发器,nothing more。分发器
:将发布者告诉自己的信息转告给订阅者,so simple。
这么一说应该已经很明确了。各个角色的定位和逻辑是不同。由于逻辑和功能的不同,导致这两种模式的应用场景也不同。
我们用现实的例子来说明吧。
观察者模式
你在路上看到蚂蚁搬家,想知道它们什么时候搬完,但是又又不想一直这么无聊的盯。所以你找个小孩,给他一块糖,叫他帮你看,好了打电话告诉你。然后你就回寝室打农药了。
小孩就是观察者
,蚂蚁搬家就是目标
,你是订阅者
。应用场景直观明了。
后来,你又看到一窝蚂蚁,只好又叫个小孩。因为职能必须唯一,当然我们不可以叫单个小孩一个人看两。
后来,又叫了个小孩……又叫了个小孩……又叫了个……
小孩多还不是麻烦,麻烦大的是,有一天,隔壁老王对这个小孩说,也通知我一下,隔壁老李对另一个小孩说,也通知我一下……
每个小孩要通知 100 个人,你等着 100 个小孩通知你。如果有 1000 个……10000 个……
订阅-发布模式
这个时候就要另一个模式出场了。有个孩子王还是很有头脑的。他对所有小孩说,你们看着蚂蚁搬家,有结果就告诉他。然后你对其它人说,谁想知道蚂蚁搬家最新进展的来我这里登记一下姓名、年龄、爱好和蚂蚁窝的编号。这时,小孩是发布者
,孩子王是分发器
,你和老王老李是订阅者
。
延伸
然后孩子王又给老王老李他们两种选择,一种是等他来打电话给老王老李,另一种是隔一段时间老王老李打电话找他问,这就是 push 和 pull 了。