什么?这听起来像是一个面试题或者是程序设计题目。但是在更深入地了解它之前,我们需要探讨一些关于这个模式的背景和用途。在本文中,我们将从多个角度对观察者模式的实现方式进行分析,并探讨其实际应用。
一、 什么是观察者模式?
观察者模式也被称为发布/订阅模式,它是一种设计模式,用于一对多的对象间的通信。它定义了一个对象与其它对象之间的依赖关系,当一个对象状态发生改变时,所有依赖于它的对象都会被通知并自动更新。这种模式的核心是主题,衍生的是观察者,它们相互之间使用回调函数进行交互。
二、 观察者模式的结构
观察者模式的结构通常由四个部分组成,它们是 :
1. 抽象主题(Subject):
主题是一个抽象类或接口,它定义了通知观察者的方法,一个主题可以拥有多个观察者。当主题状态发生改变时,通知所有的观察者。
2. 具体主题(ConcreteSubject):
具体主题是主题的具体实现。它是被观察的对象,当它的状态发生改变时会通知所有的观察者。
3. 抽象观察者(Observer):
观察者是一个抽象类或接口,它定义了观察者要实现的方法,当主题状态发生改变时,它会根据状态变化运行相应的方法。
4. 具体观察者(ConcreteObserver):
具体观察者是观察者的具体实现,在主题状态发生改变时会接收通知,并运行相应的方法。
三、 观察者模式的实现方式
现在我们已经掌握了观察者模式的结构,接下来我们将讨论它的具体实现方式。
实现方式一:使用 push (推送) 方法
push 方法指在主题对象上运行一个方法,该方法会将消息或事件推送给观察者对象。这种实现方式最常用于图形用户界面以及 web 应用程序。
以下是一个 push 观测模式的简单例子:
```javascript
class Subject {
constructor() {
this.observers = [];
}
addObserver(observer) {
this.observers.push(observer);
}
notify(data) {
this.observers.forEach(observer => observer.update(data));
}
}
class Observer {
update(data) {
console.log(`Data received: ${data}`);
}
}
const subject = new Subject();
const observer1 = new Observer();
const observer2 = new Observer();
subject.addObserver(observer1);
subject.addObserver(observer2);
subject.notify("Hello World");
```
实现方式二:使用 pull (拉动) 方法
与 push 方法相反,pull 方法是观察者主动获取主题对象中的信息。这种方法最常用于异步模型中。
以下是一个 pull 观测模式的简单例子:
```javascript
class Subject {
constructor(data) {
this.data = data;
}
getData() {
return this.data;
}
setData(data) {
this.data = data;
}
}
class Observer {
constructor(subject) {
this.subject = subject;
}
update() {
console.log(`Data received: ${this.subject.getData()}`);
}
}
const subject = new Subject("Hello World");
const observer = new Observer(subject);
observer.update();
subject.setData("Goodbye World");
observer.update();
```
实现方式三:使用中介者模式
中介者模式是使用观察者模式的另一种实现方式。中介者对象会维护一组依赖于主题的观察者对象,它们都具有相同的接口。当主题状态发生改变时,中介者对象会通过接口通知所有观察者进行更新。
以下是一个中介者模式的简单例子:
```javascript
class Mediator {
constructor() {
this.observers = [];
}
addObserver(observer) {
this.observers.push(observer);
}
update(data) {
this.observers.forEach(observer => observer.update(data));
}
}
class Observer {
update(data) {
console.log(`Data received: ${data}`);
}
}
const mediator = new Mediator();
const observer1 = new Observer();
const observer2 = new Observer();
mediator.addObserver(observer1);
mediator.addObserver(observer2);
mediator.update("Hello World");
```
四、 观察者模式的优缺点
观察者模式拥有以下优点:
1. 松耦合:观察者模式减少了主题对象与观察者对象之间的依赖关系,使得主题不需要事先知道哪些观察者需要通知。这都是因为它们可以通过抽象观察者和抽象主题相互通信。
2. 灵活性:观察者模式提供了一种简单的方式来添加或删除观察者,即使在程序运行时也可以这样做,而不会影响主题或其他观察者。
3. 分离关注点:主题和观察者对象的职责得到了分离,使得代码更加清晰易懂。
4. 可复用性:由于主题和观察者对象都是抽象的,因此它们可以在不同的程序中通用。
观察者模式拥有以下缺点:
1. 不适合数据量大的情况:如果主题对象状态发生改变的频率过高,它将大量通知观察者,导致程序运行速度变慢。
2. 观察者和主题对象之间的深层次依赖关系:观察者的代码实现通常依赖于主题对象的特定实现。这使得观察者对象难以单独测试和重用。
五、 结论
观察者模式是一种重要的设计模式,用于在多个对象之间实现通信。它提供了一种松耦合的可重用解决方案,使代码更易于维护和扩展。虽然它具有一些缺点,但在一般情况下,这种模式是一个非常有用的工具。
扫码咨询 领取资料