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

栏目: 后端 · 发布时间: 5年前

内容简介:原文地址:作者:柳树有一回面试,面试官问:

原文地址: zhuanlan.zhihu.com/p/51357583

作者:柳树

有一回面试,面试官问:

观察者模式,和发布订阅模式,有什么区别?

我脑海中立刻闪现了《Head First设计模式》里讲的:

Publishers + Subscribers = Observer Pattern
观察者模式 vs 发布订阅模式

“哼哼,我知道答案了,兄dei!”,我内心无比鸡冻。

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

“它们是一样的。”,我故作镇定,嘴角露出一丝微笑,仿佛下一秒钟面试官就会给我发offer。

面试官也笑了,“ 不,它们不一样 ”。

然后我就:

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

So, 为什么我错了?观察者模式(Observer pattern),和发布订阅模式(Publish–subscribe pattern),到底有什么不同?

观察者模式

所谓观察者模式,其实就是为了实现 松耦合(loosely coupled)

用《Head First设计模式》里的气象站为例子,每当气象测量数据有更新, changed() 方法就会被调用,于是我们可以在 changed() 方法里面,更新气象仪器上的数据,比如温度、气压等等。

但是这样写有个问题,就是如果以后我们想在 changed() 方法被调用时,更新更多的信息,比如说湿度,那就要去修改 changed() 方法的代码,这就是紧耦合的坏处。

怎么解决呢?使用观察者模式,面向接口编程,实现松耦合。

观察者模式里面, changed() 方法所在的实例对象,就是被观察者(Subject,或者叫Observable),它只需维护一套观察者(Observer)的集合,这些Observer实现相同的接口,Subject只需要知道,通知Observer时,需要调用哪个统一方法就好了:

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

这里就不贴代码了,网上已经有大量的资料。

发布订阅模式

大概很多人都和我一样,觉得发布订阅模式里的Publisher,就是观察者模式里的Subject,而Subscriber,就是Observer。Publisher变化时,就主动去通知Subscriber。

其实并不是。

在发布订阅模式里,发布者,并不会直接通知订阅者,换句话说,发布者和订阅者,彼此互不相识。

互不相识?那他们之间如何交流?

答案是,通过第三者,也就是在消息队列里面,我们常说的经纪人Broker。

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

发布者只需告诉Broker,我要发的消息,topic是AAA;

订阅者只需告诉Broker,我要订阅topic是AAA的消息;

于是,当Broker收到发布者发过来消息,并且topic是AAA时,就会把消息推送给订阅了topic是AAA的订阅者。当然也有可能是订阅者自己过来拉取,看具体实现。

也就是说,发布订阅模式里,发布者和订阅者,不是松耦合,而是完全解耦的。

放一张极简的图,给大家对比一下这两个模式的区别:

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

机器学习及其应用2007

机器学习及其应用2007

周志华 编 / 清华大学 / 2007-10 / 37.00元

机器学习是人工智能的一个核心研究领域,也是近年来计算机科学中最活跃的研究分支之一。目前,机器学习技术不仅在计算机科学的众多领域中大显身手,还成为一些交叉学科的重要支撑技术。本书邀请相关领域的专家撰文,以综述的形式介绍机器学习中一些领域的研究进展。全书共分13章,内容涉及高维数据降维、特征选择、支持向量机、聚类、强化学习、半监督学习、复杂网络、异构数据、商空间、距离度量以及机器学习在自然语言处理中的......一起来看看 《机器学习及其应用2007》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

URL 编码/解码
URL 编码/解码

URL 编码/解码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器