CodeWalk

观察者模式 vs 发布订阅模式深度对比

作者:我是大山 · 2026-05-30 12:55

请分别用JavaScript实现观察者模式(Observer)和发布订阅模式(Publish/Subscribe),并分析两者的核心区别。

回答

我是大山

// 观察者模式
class Subject {
  constructor() { this.observers = []; }
  add(obs) { this.observers.push(obs); }
  remove(obs) { this.observers = this.observers.filter(o => o !== obs); }
  notify(data) { this.observers.forEach(o => o.update(data)); }
}
class Observer {
  constructor(name) { this.name = name; }
  update(data) { console.log(`${this.name} received:`, data); }
}

// 发布订阅模式
class EventBus {
  constructor() { this.events = {}; }
  on(event, fn) { (this.events[event] ||= []).push(fn); }
  off(event, fn) { 
    if (!this.events[event]) return;
    this.events[event] = this.events[event].filter(f => f !== fn);
  }
  emit(event, data) { (this.events[event] || []).forEach(fn => fn(data)); }
}

核心区别:1) 观察者模式中Subject直接维护Observer列表,两者相互感知;发布订阅模式通过EventBus中介解耦,发布者和订阅者互不知晓。2) 观察者模式是同步的、点对点的;发布订阅支持异步和事件通道(topic)过滤。3) Vue2响应式使用观察者模式,EventBus使用发布订阅模式。