推荐答案
// www.javascriptcn.com code example
class Subject {
constructor() {
this.observers = [];
}
addObserver(observer) {
this.observers.push(observer);
}
removeObserver(observer) {
this.observers = this.observers.filter(obs => obs !== observer);
}
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, Observers!');
// 输出:
// Observer 1 received data: Hello, Observers!
// Observer 2 received data: Hello, Observers!
subject.removeObserver(observer1);
subject.notify('Observer 1 has been removed.');
// 输出:
// Observer 2 received data: Observer 1 has been removed.本题详细解读
观察者模式简介
观察者模式(Observer Pattern)是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会收到通知并自动更新。这种模式通常用于实现事件处理系统。
代码结构
Subject(主题):
observers: 存储所有观察者的数组。addObserver(observer): 添加一个观察者。removeObserver(observer): 移除一个观察者。notify(data): 通知所有观察者,并传递数据。
Observer(观察者):
name: 观察者的名称。update(data): 当主题通知时,观察者执行的操作。
使用场景
观察者模式适用于以下场景:
- 当一个对象的改变需要同时改变其他对象,且不知道具体有多少对象需要改变时。
- 当一个对象需要通知其他对象,但又不希望这些对象紧密耦合时。
优点
- 松耦合: 主题和观察者之间是松耦合的,主题不需要知道观察者的具体实现。
- 可扩展性: 可以轻松地添加或移除观察者,而不影响主题或其他观察者。
缺点
- 性能问题: 如果观察者数量过多,通知所有观察者可能会导致性能问题。
- 内存泄漏: 如果观察者没有被正确移除,可能会导致内存泄漏。
总结
观察者模式是一种非常实用的设计模式,特别适合用于事件驱动的系统中。通过实现观察者模式,可以有效地解耦对象之间的依赖关系,提高代码的可维护性和可扩展性。