js观察者模式
它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象发生变化时,它的所有观察者都会收到通知并自动更新。
// 定义主题类
class Subject {
constructor() {
this.observers = [];
}
// 添加观察者方法
addObserver(observer) {
this.observers.push(observer);
}
// 移除观察者方法
removeObserver(observer) {
this.observers = this.observers.filter(o => o !== observer);
}
// 通知观察者方法
notifyObservers() {
this.observers.forEach(observer => observer.update());
}
// 主题状态改变方法
setState(state) {
this.state = state;
this.notifyObservers();
}
}
// 定义观察者接口
class Observer {
constructor() {
if (this.constructor === Observer) {
throw new Error('不能实例化抽象类');
}
}
// 定义更新方法
update() {
throw new Error('必须实现 update 方法');
}
}
// 具体观察者类 A
class ConcreteObserverA extends Observer {
constructor() {
super();
}
// 实现更新方法
update() {
console.log('具体观察者 A 收到通知并更新');
}
}
// 具体观察者类 B
class ConcreteObserverB extends Observer {
constructor() {
super();
}
// 实现更新方法
update() {
console.log('具体观察者 B 收到通知并更新');
}
}
// 使用观察者模式
let subject = new Subject();
let observerA = new ConcreteObserverA();
let observerB = new ConcreteObserverB();
subject.addObserver(observerA);
subject.addObserver(observerB);
subject.setState('状态已改变');