观察者模式(Observer Pattern)是一种行为设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,当主题对象状态发生改变时,它的所有依赖者(观察者)都会自动收到通知并更新。
主题(Subject):也被称为被观察者,它包含了对观察者的引用列表,并提供了添加、删除观察者的方法。当主题状态改变时,它会通知所有注册的观察者。
观察者(Observer):定义了一个更新接口,用于接收主题的通知。
观察者模式主要有两种类型:
class Subject {
constructor() {
this.observers = [];
}
addObserver(observer) {
this.observers.push(observer);
}
removeObserver(observer) {
const index = this.observers.indexOf(observer);
if (index !== -1) {
this.observers.splice(index, 1);
}
}
notify(data) {
this.observers.forEach(observer => observer.update(data));
}
}
class Observer {
constructor(name) {
this.name = name;
}
update(data) {
console.log(`${this.name} received data: ${data}`);
}
}
// 使用示例
const subject = new Subject();
const observer1 = new Observer('Observer 1');
const observer2 = new Observer('Observer 2');
subject.addObserver(observer1);
subject.addObserver(observer2);
subject.notify('Hello World!'); // 输出: Observer 1 received data: Hello World! 和 Observer 2 received data: Hello World!
subject.removeObserver(observer1);
subject.notify('Hello Again!'); // 输出: Observer 2 received data: Hello Again!
问题1:观察者没有收到通知。
notify
方法没有被调用。addObserver
方法是否被正确调用,以及状态改变时是否调用了notify
方法。问题2:观察者收到多次通知。
问题3:内存泄漏。
removeObserver
方法将其从主题的观察者列表中移除。通过以上信息,你应该对JavaScript中的观察者模式有了全面的了解。