观察者(Observer Pattern)和发布/订阅模式(Pub-Sub Pattern)区别

952 阅读1分钟

前言

观察者模式(Observer Pattern)和发布/订阅模式 (Pub-Sub Pattern)的概念很相近,大多数人认为Subscriber + Publish = Observer,但是事实并非如此。

结论

观察者:观察者模式定义了对象之间的一对多依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。

发布/订阅:发布/订阅模式并非直接消息通知,存在第三方的消息代理或称消息总线(以下统称消息代理)。两者概念如下图所示。

(图片来源网络,如侵权联系删除)

也即,观察者的消息是直接通知,而发布/订阅是通过消息代理的形式通知订阅者。

重拾Vue和Vuex原理

Vue源码中,数据驱动通过defineProperty,将观察者存储在订阅器中,数据一旦变化便notify所有观察者,如所示:

而在Vuex源码中,需要先订阅Mutation/Action,再通过commit/dispatch发布消息,触发事件。如下图所示