观察者模式是一种行为设计模式,可以用于处理一对多的关系,其中一个对象被修改时,它的所有依赖项都会被通知并自动更新。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
};
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++观察者模式是一种非常常用的设计模式,它可以帮助我们实现松耦合的关系并便于扩展和维护。实现观察者模式需要定义主题和观察者类,并包括增加、删除、通知和更新方法等。在使用观察者模式时需要权衡好优缺点并灵活应用。
扫码咨询 领取资料