观察者模式与发布-订阅模式
两种处理一对多通知关系的模式,常被混淆但有关键区别。
观察者模式(Observer)
主题直接通知观察者,两者间存在直接依赖。
Subject ──直接调用──▶ Observer[]- Subject 维护观察者列表
addObserver / removeObserver / notify - 状态变化时调用每个 Observer 的
update() - 耦合:Subject 知道 Observer 接口
发布-订阅模式(Pub-Sub)
中间引入事件通道(Event Bus),发布者和订阅者完全解耦。
Publisher ──emit──▶ Event Channel ──dispatch──▶ Subscriber[]- Publisher 不知道谁接收
- Subscriber 不知道谁发出
- 支持多对多、消息过滤、异步投递
关键区别
| 维度 | 观察者 | Pub-Sub |
|---|---|---|
| 耦合 | Subject 依赖 Observer | 完全解耦 |
| 通信 | 直接同步调用 | 通过事件通道 |
| 中介 | 无 | Event Bus / Broker |
| 典型例子 | DOM EventListener | Vue EventBus、Redis Pub/Sub、MQTT |
前端实践
Vue 的响应式系统本质上是观察者(Dep → Watcher),Vue 3 的 emitter 和 React 的 EventEmitter 更接近 Pub-Sub。