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

参考:知乎-观察者模式 vs 发布订阅模式

观察者模式

image-20201203201203357

原理:其实就是在Subject类中维护了一个Observer的队列。

调用 Subject.订阅(mObserver)方法就是把该mObserver放入队列中。

当Subject中发生变化时,遍历Observer队列,依次调用Observer的收到通知方法。

即完成了观察者模式。

这里有个纠结的地方困扰了我好久:明明是Observer观察者(比如用户、人)订阅Subject(比如报刊、公众号),代码里却要写成 Subject.订阅(mObserver)。很绕??

这里这么想:

虽然是你订阅了报刊,实际上报刊在 订阅者列表 中把你加了进去。核心操作是由被观察者 Subject 做的!!!

你关注了一个公众号,实际是你把你的ID告诉了公众号,让公众号每次更新的时候告诉你一声。核心是公众号,即被观察者

所以是Subject.订阅(mObserver)

发布/订阅模式

一开始以为两个模式是一样的。后来才发现还是有区别的:

image-20201203202856572

严格来说,这种才是发布/订阅模式

Publisher内部不直接维护一堆Subscribers,而是转交给经纪人Broker来维护。

这样才算真正解耦了,发布者和订阅者彼此都不知道彼此的存在,很干净。