观察者模式(Observer Pattern) 和 发布-订阅模式(Pub/Sub Pattern) 经常被混用,但它们在耦合度、通信方式、使用场景上是有区别的。下面从多个维度来对比说明。
观察者模式是“直接通知”,发布-订阅模式是“通过中介分发”。
对象之间存在一对多依赖关系,当目标对象(Subject)状态发生变化时,直接通知所有观察者(Observer)。
Subject(被观察者)
├── registerObserver()
├── removeObserver()
└── notifyObservers()
Observer(观察者)
└── update()
✅ 结构清晰
✅ 实现简单
❌ 被观察者和观察者强耦合
class Subject {
List<Observer> observers = new ArrayList<>();
void notifyObservers() {
for (Observer o : observers) {
o.update();
}
}
}
发布者和订阅者互不认识,通过**消息中间件(事件总线)**进行通信。
Publisher → Event Bus → Subscriber
✅ 解耦彻底
✅ 易于扩展
✅ 支持异步、跨模块 / 跨系统
❌ 结构复杂
eventBus.on('order_created', callback);
eventBus.emit('order_created', data);
| 对比项 | 观察者模式 | 发布-订阅模式 |
|---|---|---|
| 是否有中介 | ❌ 无 | ✅ 有(事件总线 / MQ) |
| 耦合度 | 强耦合 | 松耦合 |
| 谁通知谁 | 被观察者 → 观察者 | 发布者 → 中介 → 订阅者 |
| 角色感知 | 互相知道 | 互不知道 |
| 是否支持异步 | 通常是同步 | 通常支持异步 |
| 典型应用 | UI、MVC | 消息队列、前端事件 |
发布-订阅是观察者模式的“升级版”或“变种”
❌ 常见误区:
“Vue 的
$emit/$on是观察者模式”
✅ 更准确的说法:
Vue 的事件机制是发布-订阅模式
观察者模式中,被观察者直接通知观察者,两者耦合较紧;
发布-订阅模式通过事件通道解耦发布者和订阅者,适合更大规模或异步通信。
如果你愿意,我可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。