跳到主要内容

观察者模式 (Observer)

· 阅读需 2 分钟

观察者模式是一种行为设计模式,允许你定义一种订阅机制,可在对象事件发生时通知多个 “观察” 该对象的其他对象。

  • 开闭原则,你无需修改发布者代码就能引入新的订阅者类(如果是发布者接口则可轻松引入发布者类)。
  • 你可以在运行时建立对象之间的联系。
  • 订阅者的通知顺序是随机的。

示例

具体观察者 ConcreteObserverA 实现 Observer 接口,ConcreteSubject 实现 Subject 接口。

interface Subject {
attach(observer: Observer): void;
detach(observer: Observer): void;

// 通知所有订阅者
notify(): void;
}

interface Observer {
update(): void;
}

class ConcreteSubject implements Subject {
// 观察者列表
private observerList: Observer[] = [];

attach(observer: Observer): void {
this.observerList.push(observer);
}
detach(observer: Observer): void {
this.observerList.splice(this.observerList.indexOf(observer), 1);
}

// 遍历通知每个观察者
notify(): void {
for (const observer of this.observerList) {
observer.update();
}
}
}

class ConcreteObserverA implements Observer {
update(): void {
console.log('ObserverA update');
}
}

class ConcreteObserverB implements Observer {
update(): void {
console.log('ObserverB update');
}
}

const subject = new ConcreteSubject();
const observerA = new ConcreteObserverA();
const observerB = new ConcreteObserverB();
subject.attach(observerA);
subject.attach(observerB);

subject.notify();

输出:

ObserverA update
ObserverB update