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

c++观察者模式

希赛网 2024-06-09 09:40:09

观察者模式是一种行为设计模式,可以用于处理一对多的关系,其中一个对象被修改时,它的所有依赖项都会被通知并自动更新。C++中的观察者模式可以通过使用模板类和STL库来实现。在本文中,我将从多个角度分析C++观察者模式的实现和使用。

1. 模式介绍

观察者模式中有两个主要角色: 主题和观察者。主题(也称为可观察对象)是被观察的对象,即当状态发生改变时会通知观察者。观察者是依赖于主题状态的对象,并在主题状态发生变化时被通知。当然,一个主题可以有多个观察者。

在C++中,可以通过使用STL库的vector容器实现观察者模式。主题可以将观察者存储在vector容器中,以便在状态发生变化时能够通知它们。

2. 实现

使用C++实现观察者模式需要定义主题和观察者类,并包括以下方法:

- 主题类:

- 增加观察者

- 删除观察者

- 通知观察者

- 观察者类:

- 更新

以下是一个示例代码:

```

#include

#include

using namespace std;

class Observer;

class Subject{

public:

virtual void addObserver(Observer* observer) = 0;

virtual void deleteObserver(Observer* observer) = 0;

virtual void notifyObservers() = 0;

};

class Observer{

public:

virtual void update() = 0;

};

class ConcreteObserver1: public Observer{

public:

void update(){

cout << "ConcreteObserver1 has been updated." << endl;

}

};

class ConcreteObserver2: public Observer{

public:

void update(){

cout << "ConcreteObserver2 has been updated." << endl;

}

};

class ConcreteSubject: public Subject{

public:

void addObserver(Observer* observer){

observers.push_back(observer);

}

void deleteObserver(Observer* observer){

for(auto it = observers.begin(); it != observers.end(); ++it){

if(*it == observer){

observers.erase(it);

break;

}

}

}

void notifyObservers(){

for(auto observer: observers){

observer->update();

}

}

private:

vector observers;

};

int main(){

ConcreteSubject subject;

ConcreteObserver1 observer1;

ConcreteObserver2 observer2;

subject.addObserver(&observer1);

subject.addObserver(&observer2);

subject.notifyObservers();

subject.deleteObserver(&observer1);

subject.notifyObservers();

}

```

3. 用途

观察者模式在很多场景下都非常有用。例如,一个媒体网站需要在新文章发布时通知其订阅者,或者一个智能家居设备需要在状态变化时通知用户等等。

4. 优缺点

观察者模式的优点包括:松耦合、可扩展、易于维护和重用等。同时,它的缺点也不可忽略,包括:增加新观察者会导致开销增加、避免循环依赖等。

5. 总结

C++观察者模式是一种非常常用的设计模式,它可以帮助我们实现松耦合的关系并便于扩展和维护。实现观察者模式需要定义主题和观察者类,并包括增加、删除、通知和更新方法等。在使用观察者模式时需要权衡好优缺点并灵活应用。

扫码咨询 领取资料


软考.png


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

软考资格查询系统

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