# 发布-订阅和观察者模式

TIP

发布(Publish)/订阅(Subscribe)模式是一种和观察者(Observer)模式很相似的设计模式,以至于很多人把这两种模式看作是同一种模式

# 发布-订阅模式

关键点:

  1. 订阅者在订阅事件的时候实际是在发布者对象的数组中写入要订阅的事件。
  2. 发布者在发布或者叫trigger事件的时候,实际是在发布者中遍历数组中订阅者的事件方法。

举例:

小明最近看上了一套房子,到了售楼处之后才被告知,该楼盘的房子早已售罄。好在售楼MM告诉小明,不久后还有一些尾盘推出,手续办好后就可以购买。
但到底什么时候,目前还没有人知道。 于是小明记下了售楼处的电话,以后每天都会打电话过去询问是不是到了购买时间。
除了小明,还有小红、小强等也会每天向售楼处咨询这个问题。一个星期后,售楼MM决定辞职,因为厌倦了每天回答1000个相同内容的电话。 当然现实中没有这么笨的售楼公司,
实际上故事是这样的:小明离开之前,把电话号码留在了售楼处。售楼MM答应他,新楼盘一推出就马上发信息通知小明。
小红、小强、小龙也是一样,他们的电话号码都被记在售楼处的花名册上,新楼盘推出的时候,售楼MM会翻开花名册,遍历上面的电话号码,依次发送一条短信来通知他们。

这个例子中售楼MM就是发布者, 小明等人就是订阅者

# 概念

订阅者把自己想订阅的事件注册到调度中心,当该事件触发时候,发布者发布该事件到调度中心(顺带上下文),由调度中心统一调度订阅者注册到调度中心的处理代码。 An image

# 观察者模式

# 概念

目标和观察者是基类,目标提供维护观察者的一系列方法,观察者提供更新接口。具体观察者和具体目标继承各自的基类,然后具体观察者把自己注册到具体目标里,在具体目标发生变化时候,调度观察者的更新方法。

An image

# 区别

用一个图来直观地感受一下两种模式之间的区别

An image

  1. 从上面的图片中可以看到,最大的区别是调度的地方。虽然两种模式都存在订阅者和发布者(具体观察者可认为是订阅者、具体目标可认为是发布者),但是观察者模式是由具体目标调度的,而发布/订阅模式是统一由调度中心调的,所以观察者模式的订阅者与发布者之间是存在依赖的,而发布/订阅模式则不会。
  2. 在发布订阅模式中,组件是松散耦合的,正好和观察者模式相反