面试必会知识点之发布订阅模式/观察者模式(圈起来,要考)

281 阅读4分钟

前言

马上又到金三银四面试季了,节后打算换工作的现在应该已经在"头悬梁,锥刺股"了,而发布订阅模式作为高频知识点,在面试中也经常被提及,而且最近自己也刚好在看发布订阅模式的知识点,就想和大家分享一下我的理解。网上也有很多关于发布订阅模式和观察者模式的文章了,有人认为发布订阅模式等同于观察者模式,也有人认为两者之间存在一定的差异,根据我个人理解,更认同后一种观点,下面就具体谈谈我的一些理解【ps:如有错误,欢迎指正,求轻喷,别打脸】

观察者(Observer)模式

概念定义:

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

简单来说就是,目标对象(subject)的状态发生改变时,会通知所有依赖它的对象(observer),观察者模式中主体和观察者是互相感知的。

附近农场有个奶农,周围的人都会从他那里订牛奶。奶农会统计预订者所定的牛奶种类比如大瓶的或者小瓶的以及联系方式。那么我们可以把奶农看作被观察者(subject),预定牛奶的人看作是观察者(observer)。当奶农挤好奶之后,会把牛奶送到村子里并打电话通知他们去取牛奶。预订者就可以喝到新鲜的牛奶了。是不是so easy!?

发布订阅(Publisher-Subscriber)模式

概念定义:

发布-订阅是一种消息范式,消息的发送者(称为发布者)不会将消息直接发送给特定的接收者(称为订阅者)。而是将发布的消息分为不同的类别,无需了解哪些订阅者(如果有的话)可能存在。同样的,订阅者可以表达对一个或多个类别的兴趣,只接收感兴趣的消息,无需了解哪些发布者(如果有的话)存在。

还是预定牛奶,农场离村子太远了,有人就在村子和农场之间开了个奶站(event channel),这次预订者(Subscriber)都去奶站定牛奶,奶农(Publisher)把牛奶挤好之后分了大瓶和小瓶装的统一都卖到奶站去,不用关心哪些人买了哪些牛奶,村子里的人可以去奶站定不同的牛奶,也不用关心是哪家农场送来的牛奶。是不是so easy!?

说了这么多,这两种模式的联系和区别到底是什么呢?

联系与区别

联系

发布订阅模式是最常用的一种观察者模式的实现,并且从解耦和重用角度来看,更优于典型的观察者模式。

区别

一图胜千言,直接上图

结合上图,我们可以简单总结一下两者的区别:

  • 在观察者模式中,存在两个角色,观察者 + 被观察者。观察者需要直接订阅目标事件;在目标发出内容改变的事件后,直接接收事件并作出响应。观察者和被观察者,是松耦合的关系。

  • 在发布订阅模式中,存在三个角色, 观察者 + 事件通道 + 订阅者;发布者和订阅者之间多了一个事件通道;一方面从发布者接收事件,另一方面向订阅者发布事件;订阅者需要从事件通道订阅事件。以此避免发布者和订阅者之间产生依赖关系。发布者和订阅者,则完全不存在耦合。

从使用场景来看:

  • 观察者模式,多用于单个应用内部
  • 发布订阅模式,则更多的是一种跨应用的模式(cross-application pattern),比如我们常用的消息中间件

这里仅从概念上对两种模式进行一下分析。关于两种模式的代码实现,这里就不贴出来了,网上大佬们已经给出很多优秀的示例了,有需要的可以自行去学习。

本文旨在交流学习,如有不对,欢迎留言指正~