它们不一样!透析【观察者模式】和【发布订阅模式】
观察者模式常常会和发布订阅模式一起哪来比较,它们二者同样重要。
直观的例子:
Vue 的双向绑定原理用到了发布订阅模式的思想;
在函数式编程中,广泛应用观察者设计模式思想。
但是,可能在平常,写业务代码,真实用到这两样设计思想的并不多,只好在做技术总结的时候复盘一下,温故再温故啦。(也有一种可能是:或许是运用还不是很熟,在有些场景,可以用到,但会忽视掉)
闲话少说,奥利给,冲它!!
<hr>
简介
观察者模式和发布订阅模式的区别在于:
后者比前者多了一个中间商。
观察者模式:
观察者 Observer
被观察者 Subject
发布订阅模式:
订阅者 subscriber (类似于观察者)
发布者 publisher (类似于被观察者)
调度中心(中间商)
一图胜千言:
有了以上的基本认识,咱们再展开说说~~
观察者模式
观察者模式之前写过 https://juejin.cn/post/7072898729388277797,这里再优化下注解,并再封装一个 Observer 类,由此创建多个 Observer 实例:
要点小结:
写一个 Subject 类,有:添加观察者 add、通知观察者 notify 方法(也可补充写删除观察者 del 方法);
写一个 Observer 类,打印出所接收到的信息;
实例化一个被观察者;
实例化一个或多个观察者;
用 add 方法进行绑定;
用 notify 方法进行通知;
发布订阅模式
发布订阅模式,就是比观察者模式多了一个“中间商”,也叫调度中心;
发布者 publisher == 被观察者 Subject
订阅者 subscriber == 观察者 Observer
调度中心 Event Channel,或者说是大家熟悉的 Vue 双向绑定中的 Dep,依赖管理中心、订阅中心
要点小结:
写一个 Pub 发布者类,有添加调度中心 addDep,推送消息 publish 两个方法;
写一个 Sub 订阅者类,有获取信息 update 方法;
写一个 Dep 调度中心类,有添加订阅者 addSub,通知消息 notify 两个方法;
实例化发布者;
实例化 1 个或多个调度的对象;
实例化 1 个或多个订阅者对象;
发布者绑定调度中心;
调度中心绑定订阅者;
发布者发布消息;
由上面的例子可见,发布者不会把消息直接发给订阅者,而是会先发给调度中心,再由调度中心发给订阅者;
有小朋友就问了:不就比观察者模式多了个“中间商”,有这个必要吗??
答案是肯定的!当然有!!
观察者模式中,被观察者直接把消息发给观察者,这是强绑定的,作为观察者,只有我主动绑定了我要观察的对象,我才能知道它发的消息给我;
而在发布订阅模式中,发布者和订阅者是 完全解耦 的,作为发布者,我把消息发给调度中心之后,我就不用管了,我只负责发布消息,不管谁接收;同样,订阅者,只负责接收调度中心来的消息,不用管是哪个发布者发的;
高内聚、低耦合,是我们的最终追求!!
小结
观察者模式和发布订阅模式,想想还是挺有意思的;
为什么要这么演进,我尝试用一个实际生活场景解释 —— 领导的发言稿,要打印出来,供下面的同事学习;
做法 1:没有任何设计思想时,每个人都去找领导要这个稿子的电子版,然后去打印;
做法 2:用观察者模式设计思想,领导主动把这个电子稿以邮件形式群发给大家,让大家自行打印;如果稿件有内容变动的话,领导再主动推送给大家一份新的;
做法 3:用发布订阅者模式设计思想,领导发给秘书,秘书再分发给大家;因为稿件可能存在部分敏感信息,需要经过处理,分发给不同的同事,比如某类员工只能看其中一部分内容;
<hr>
OK,以上便是本篇分享。 觉得不错点个赞吧👍👍👍,您的鼓励,我的动力,坚持原创质量好文~~ 欢迎评论留言 我是掘金安东尼,输出暴露输入,技术洞见生活。再会吧~~ 👋👋👋
版权声明: 本文为 InfoQ 作者【掘金安东尼】的原创文章。
原文链接:【http://xie.infoq.cn/article/1cb65c2d25f608a83ec12b566】。文章转载请联系作者。
评论