观察者模式与发布/订阅模式

很像却不是同一个东西,记录一下自己的理解
更新于: 2021-12-19 12:57:28

观察者模式

  • 优点: 没有订阅就不会执行,这样会有一种 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');
}

多模块大项目设计

  1. 可以使用 tree/submodule 方式设计多个调度器
  2. 或者用  event.namespace 方式来约定整件的发布
// 方式1:
// 直接拆分不同的调度器
// 中心调度器 - 子模块调度器
eventBus
    - bus1
    - bus2
    - bus3

// 方式2: 
// 可以用  event.namespace 方式来拆分
eventBus.on('module1.xx');
eventBus.emit('module1.xx');

参考

https://www.pianshen.com/article/4391156988/