前言
观察者模式(Observer Pattern)和发布/订阅模式 (Pub-Sub Pattern)的概念很相近,大多数人认为Subscriber + Publish = Observer,但是事实并非如此。
结论
观察者:观察者模式定义了对象之间的一对多依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
发布/订阅:发布/订阅模式并非直接消息通知,存在第三方的消息代理或称消息总线(以下统称消息代理)。两者概念如下图所示。
(图片来源网络,如侵权联系删除)也即,观察者的消息是直接通知,而发布/订阅是通过消息代理的形式通知订阅者。
重拾Vue和Vuex原理
Vue源码中,数据驱动通过defineProperty,将观察者存储在订阅器中,数据一旦变化便notify所有观察者,如所示:
而在Vuex源码中,需要先订阅Mutation/Action,再通过commit/dispatch发布消息,触发事件。如下图所示