Skip to content

观察者模式

观察者模式(Observer Pattern)是一种行为设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象发生变化时,它的所有依赖者(观察者)都会收到通知并自动更新。这种模式是实现分布式事件处理系统的基础,极大地提高了对象间通信的灵活性和可维护性。

观察者模式的关键角色

  1. Subject(主题/被观察者):知道其观察者,并提供注册和删除观察者的接口。
  2. Observer(观察者):为那些在主题发生改变时需获得通知的对象定义一个更新接口。
  3. ConcreteSubject(具体主题):存储有关状态,这些状态可能在其观察者之间共享。当状态变化时,会通知其观察者。
  4. ConcreteObserver(具体观察者):维护一个指向具体主题对象的引用,以获取主题状态,并实现 Observer 定义的更新接口来接收来自主题的通知。

在 JavaScript 中的实现

下面是一个简单的观察者模式的实现示例:

javascript
class Subject {
  constructor() {
    this.observers = [];
  }

  // 添加观察者
  addObserver(observer) {
    this.observers.push(observer);
  }

  // 移除观察者
  removeObserver(observer) {
    this.observers = this.observers.filter((obs) => obs !== observer);
  }

  // 通知所有观察者
  notifyObservers(message) {
    this.observers.forEach((observer) => observer.update(message));
  }
}

class Observer {
  constructor(name) {
    this.name = name;
  }

  // 更新方法
  update(message) {
    console.log(`${this.name} received message: ${message}`);
  }
}

// 使用示例
const subject = new Subject();

const observer1 = new Observer("Observer 1");
const observer2 = new Observer("Observer 2");

subject.addObserver(observer1);
subject.addObserver(observer2);

subject.notifyObservers("Hello Observers!"); // Observer 1 和 Observer 2 都会收到消息

subject.removeObserver(observer1);

subject.notifyObservers("Observer 1 has been removed."); // 只有 Observer 2 收到消息

代码解释

  • Subject 类:管理观察者列表,提供了添加、移除观察者的方法,并且有一个 notifyObservers 方法用于向所有观察者发送通知。
  • Observer 类:每个观察者都有一个 update 方法,当主题状态发生变化时,这个方法会被调用。
  • 使用示例:创建了两个观察者实例,并将它们添加到主题中。然后通过 notifyObservers 方法通知所有观察者。最后演示了如何从主题中移除一个观察者。

应用场景

观察者模式非常适合需要在对象之间进行广播式通信的场合,如:

  • 事件驱动系统:比如用户界面事件处理,当某个 UI 元素的状态发生变化时,可以通知所有相关的组件进行相应的更新。
  • 模型视图控制器(MVC)架构:模型作为主题,视图作为观察者,模型数据的变化会自动反映到视图上。
  • 实时数据更新:例如股票行情、天气预报等应用中,当数据源发生变化时,所有的订阅者都可以立即得到最新的数据。

通过使用观察者模式,可以使系统的各部分更加解耦,提高代码的复用性和可维护性。此外,它还支持动态地添加或移除观察者,这增加了系统的灵活性。

Released under the MIT License.