观察者模式与发布/订阅模式
很像却不是同一个东西,记录一下自己的理解
观察者模式
- 优点: 没有订阅就不会执行,这样会有一种 lazy 的感觉,性能会更好(如果真的有这种场景的话)
- 缺点: 耦合
- 典型实现: rxjs observerble、早期MVVM 框架内部实现(不过 rxjs 的 share 其实就是一种 pub-sub 的实现)
- 场景: 由于没有中间调度层,可以更方便的在 observeble/observer 之间直接调用对方的方法,少一层,性能更加的好;而且,这些属于 mvvm 这种框架内部实现,其实也是一种高内聚的体现
发布/订阅模式
- 优点: 解耦,消息发布者/消息订阅都都不需要知道双方的存在,只要知道有个调度器就行了(总调度器/当前模块的调度器)
- 缺点: 不管有没有订阅者,你关不关心,消息都会发布(PUSH 方式提供数据)
- 典型实现: EventEmitter
项目中的调度器设计
中小型项目,只有一个中心调度器即可
import EventMitt from '@jswork/event-mitt';
const eventBus = nx.mix(null, EventEmitt);
// a component
// 订阅
const sub = eventBus.on('message1', ()=>{
console.log('b event triggerd.');
});
// 取消订阅
sub.destroy();
// b component
// 消息发布
onClick = e =>{
eventBus.emit('message1');
}
多模块大项目设计
- 可以使用 tree/submodule 方式设计多个调度器
- 或者用 event.namespace 方式来约定整件的发布
// 方式1:
// 直接拆分不同的调度器
// 中心调度器 - 子模块调度器
eventBus
- bus1
- bus2
- bus3
// 方式2:
// 可以用 event.namespace 方式来拆分
eventBus.on('module1.xx');
eventBus.emit('module1.xx');