观察者模式
定义:一个或多个对象(观察者)订阅另一个对象(主题),当主题发生变化(被激活)的时候,就会通知所有的订阅对象,触发观察者里面的事件
也就是说被观察者中保存着所有观察者对象,当被观察者有变动时,就会逐一的把消息通知给每一个观察者对象(调用观察者的方法)
优点
-
观察者与被观察者之间是抽象耦合的,更容易操作
-
建立了一套完善触发机制
缺点
- 如果一个被观察者有许多直接或间接观察者对象的话,那么将所有的观察者通知到将花费很多时间
- 观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化
订阅发布模式
定义:订阅者把自己想要订阅的事件注册到调度中心,当发布者发布事件到调度中心时(对应的事件就会被触发),由调度中心统一调度订阅者注册到事件中心的逻辑代码
发布/订阅是一种消息范式,消息的发送者(发布者)不会将消息直接发送给接收者(订阅者),而是将发布的消息分为不同的类别,而无需了解哪些订阅者可能存在,由中间媒介在发送给订阅者,同样的,订阅者可以表达对一个或多个类别的兴趣,只接收感兴趣的消息,无需了解哪些发布者的存在
发布者和订阅者之间没有直接的关系,而是通过一个中间的媒介(调度中心)来进行转发处理
优点
- 相比于观察者模式,订阅发布模式两者之间的耦合性更低
- 通过并行操作,消息缓存或基于网络的路由等技术,发布/订阅模式提供了比传统的客户端-服务器端更好的可扩展性
缺点
- 当消息事件中间件采用定时发布通知时,订阅发布模式无法确认所有的订阅者都收到了消息
- 当负载激增,请求订阅的订阅者数量增加,每个订阅者接收到通知的速度将会变慢
两者区别
通过上面的描述,我可以大致就可以知道两者的区别
- 观察者模式内部维护了观察者,知道有哪些观察者的存在,而发布/订阅模式则省略了这一步骤,直接维护订阅者的事件机制,不用管谁在订阅
- 发布/订阅模式相比观察者模式多了一个中间媒介,有了这个中间媒介之后,发布者和订阅者的关联就更加的松耦合
- 观察者模式通常用于
同步的场景, 而发布/订阅模式大多用于异步的场景,如消息队列