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

观察者模式代码实现

希赛网 2024-06-07 09:58:51

观察者模式是一种常见的设计模式,在软件工程中应用广泛。该模式定义了一个一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都会得到通知并自动更新。在本文中,我将从多个角度分析观察者模式,并给出一个代码实现。

一、模式结构

观察者模式由以下几个部分组成:

1. Subject(主题):被观察的对象,它包含一组观察者对象,当状态发生变化时,它会通知所有的观察者。

2. Observer(观察者):定义了一个更新接口,当被观察者的状态发生改变时,观察者能够得到通知并进行相应的处理。

3. ConcreteSubject(具体主题):实现了抽象主题中的通知方法,在状态发生改变时向观察者发送通知。

4. ConcreteObserver(具体观察者):实现了观察者接口中的更新方法,当接收到主题通知时进行相应的处理。

二、代码实现

下面给出一个简单的代码实现,以演示观察者模式的具体应用:

```

// 主题

class Subject {

constructor() {

this.observers = [];

}

// 添加观察者

addObserver(observer) {

this.observers.push(observer);

}

// 删除观察者

removeObserver(observer) {

const index = this.observers.indexOf(observer);

this.observers.splice(index, 1);

}

// 通知观察者

notifyObservers(state) {

this.observers.forEach(observer => observer.update(state));

}

}

// 观察者

class Observer {

constructor() {

this.state = null;

}

// 更新状态

update(state) {

this.state = state;

this.render();

}

// 渲染

render() {

console.log(`State:${this.state}`);

}

}

// 具体主题

class ConcreteSubject extends Subject {

constructor() {

super();

this.state = null;

}

// 设置状态

setState(state) {

this.state = state;

this.notifyObservers(state);

}

}

// 具体观察者

class ConcreteObserver extends Observer {}

// 实例化主题和观察者对象

const subject = new ConcreteSubject();

const observer1 = new ConcreteObserver();

const observer2 = new ConcreteObserver();

// 添加观察者

subject.addObserver(observer1);

subject.addObserver(observer2);

// 设置状态并通知观察者

subject.setState('ready');

```

在上述代码中,Subject、ConcreteSubject、Observer和ConcreteObserver分别对应观察者模式中的Subject、ConcreteSubject、Observer和ConcreteObserver。具体来说,Subject中定义了一个observers数组,用于存储观察者对象;addObserver()和removeObserver()方法用于添加和删除观察者;notifyObservers()方法用于通知所有观察者。Observer中定义了一个state属性,表示当前观察者的状态;update()方法用于接收主题通知并更新状态;render()方法用于渲染状态。ConcreteSubject中继承了Subject,同时定义了一个state属性,用于表示主题的状态;setState()方法用于设置状态并通知所有观察者。ConcreteObserver中继承了Observer。

三、优劣势分析

观察者模式具有以下优点:

1. 观察者和被观察者之间松耦合:观察者只需要关注被观察者的状态变化,无需关注被观察者的具体实现,从而实现了松耦合。

2. 可扩展性好:可以动态添加新的观察者或删除现有的观察者,从而提高系统的灵活性和可扩展性。

3. 遵循开闭原则:观察者模式对于扩展开放、对于修改关闭,当需要增加新的观察者时,无需修改现有代码,只需要添加新的观察者即可。

同时,观察者模式也存在一定的缺点:

1. 观察者过多:如果观察者太多,会导致通知的操作效率降低。

2. 循环依赖:如果观察者和被观察者彼此依赖,可能会导致系统陷入循环依赖的状态。

扫码咨询 领取资料


软考.png


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

软考资格查询系统

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