实现C++中的观察者设计模式通常包括以下几个关键组件:
1. **Subject(主题)**:这是被观察的对象,它维护一个观察者列表,并提供注册、注销观察者的方法以及通知所有观察者的方法。
2. **Observer(观察者)**:这是一个抽象接口或基类,定义了观察者需要实现的更新接口(如`update()`方法),以便在接收到主题的通知时进行相应的响应。
3. **ConcreteObserver(具体观察者)**:这些是实现了`Observer`接口的具体类,每个观察者有自己的更新逻辑,当接收到主题的通知时,会调用自己的`update()`方法来处理新的状态或数据。
以下是一个简单的C++实现示例:
```cpp
#include <iostream>
#include <vector>
#include <algorithm>
// 定义观察者接口(抽象基类)
class Observer {
public:
virtual ~Observer() = default;
// 更新方法,由具体观察者实现
virtual void update(const int& new_state) = 0;
};
// 具体观察者类A
class ConcreteObserverA : public Observer {
public:
void update(const int& new_state) override {
std::cout << "Observer A received update: " << new_state << std::endl;
// 在这里处理新状态,比如更新UI、触发计算等
}
};
// 具体观察者类B
class ConcreteObserverB : public Observer {
public:
void update(const int& new_state) override {
std::cout << "Observer B received update: " << new_state << std::endl;
// 在这里处理新状态,根据业务需求进行相应操作
}
};
// 主题类,管理观察者并负责通知
class Subject {
private:
std::vector<Observer*> observers_;
int state_; // 假设主题有一个整型状态
public:
void attach(Observer* observer) {
observers_.push_back(observer);
}
void detach(Observer* observer) {
observers_.erase(std::remove(observers_.begin(), observers_.end(), observer), observers_.end());
}
void setState(const int& new_state) {
state_ = new_state;
notifyObservers();
}
private:
void notifyObservers() {
for (Observer* observer : observers_) {
observer->update(state_);
}
}
};
int main() {
Subject subject;
ConcreteObserverA observerA;
ConcreteObserverB observerB;
subject.attach(&observerA);
subject.attach(&observerB);
subject.setState(10); // 设置新状态,观察者们会收到通知
return 0;
}
```
在这个例子中:
- `Observer`接口定义了观察者必须实现的`update()`方法。
- `ConcreteObserverA`和`ConcreteObserverB`是具体的观察者类,它们实现了各自的`update()`方法来响应状态变化。
- `Subject`类维护了一个观察者列表,提供了`attach()`和`detach()`方法来添加和移除观察者,以及`setState()`方法来设置新的状态。当状态改变时,`notifyObservers()`会被调用,遍历观察者列表并调用每个观察者的`update()`方法。
这个简单示例展示了观察者模式的核心原理。实际应用中,可能还需要考虑线程安全、事件类型区分、弱引用避免循环引用等问题,具体实现会根据实际应用场景进行相应的扩展和优化。
标签:Observer,void,观察者,update,observers,state,设计模式 From: https://blog.csdn.net/weixin_43803780/article/details/138034987