希赛考试网
首页 > 软考 > 软件设计师

观察者模式的实现方式是

希赛网 2024-06-06 18:44:43

什么?这听起来像是一个面试题或者是程序设计题目。但是在更深入地了解它之前,我们需要探讨一些关于这个模式的背景和用途。在本文中,我们将从多个角度对观察者模式的实现方式进行分析,并探讨其实际应用。

一、 什么是观察者模式?

观察者模式也被称为发布/订阅模式,它是一种设计模式,用于一对多的对象间的通信。它定义了一个对象与其它对象之间的依赖关系,当一个对象状态发生改变时,所有依赖于它的对象都会被通知并自动更新。这种模式的核心是主题,衍生的是观察者,它们相互之间使用回调函数进行交互。

二、 观察者模式的结构

观察者模式的结构通常由四个部分组成,它们是 :

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. 观察者和主题对象之间的深层次依赖关系:观察者的代码实现通常依赖于主题对象的特定实现。这使得观察者对象难以单独测试和重用。

五、 结论

观察者模式是一种重要的设计模式,用于在多个对象之间实现通信。它提供了一种松耦合的可重用解决方案,使代码更易于维护和扩展。虽然它具有一些缺点,但在一般情况下,这种模式是一个非常有用的工具。

扫码咨询 领取资料


软考.png


软件设计师 资料下载
备考资料包大放送!涵盖报考指南、考情深度解析、知识点全面梳理、思维导图等,免费领取,助你备考无忧!
立即下载
软件设计师 历年真题
汇聚经典真题,展现考试脉络。精准覆盖考点,助您深入备考。细致解析,助您查漏补缺。
立即做题

软考资格查询系统

扫一扫,自助查询报考条件