用c++实现观察者模式
时间: 2023-11-29 07:02:28 浏览: 42
观察者模式是一种行为设计模式,它允许对象在其状态发生变化时通知其所有依赖项。在这种模式中,有两种主要的对象:主题(subject)和观察者(observer)。主题维护一个由观察者组成的列表,当主题的状态发生变化时,它会遍历这个列表,并通知所有的观察者。观察者可以根据收到的通知来更新自己的状态。
下面是一个用 C++ 实现观察者模式的示例:
```cpp
#include <iostream>
#include <vector>
// 观察者基类
class Observer {
public:
virtual void update(int data) = 0;
};
// 主题基类
class Subject {
public:
virtual void attach(Observer* observer) = 0;
virtual void detach(Observer* observer) = 0;
virtual void notify() = 0;
};
// 具体主题类
class ConcreteSubject : public Subject {
private:
int m_data;
std::vector<Observer*> m_observers;
public:
void attach(Observer* observer) override {
m_observers.push_back(observer);
}
void detach(Observer* observer) override {
for (auto it = m_observers.begin(); it != m_observers.end(); ++it) {
if (*it == observer) {
m_observers.erase(it);
return;
}
}
}
void notify() override {
for (auto observer : m_observers) {
observer->update(m_data);
}
}
void setData(int data) {
m_data = data;
notify();
}
};
// 具体观察者类
class ConcreteObserver : public Observer {
private:
int m_data;
public:
void update(int data) override {
m_data = data;
std::cout << "ConcreteObserver received update with data " << m_data << std::endl;
}
};
int main() {
ConcreteSubject subject;
ConcreteObserver observer1;
ConcreteObserver observer2;
subject.attach(&observer1);
subject.attach(&observer2);
subject.setData(42);
subject.detach(&observer1);
subject.setData(123);
return 0;
}
```
在这个示例中,`Subject` 是主题基类,`ConcreteSubject` 是具体主题类,`Observer` 是观察者基类,`ConcreteObserver` 是具体观察者类。`ConcreteSubject` 维护一个观察者列表,当其数据发生变化时,会遍历这个列表,并通知所有的观察者。`ConcreteObserver` 在收到通知后会更新自己的状态。在 `main()` 函数中,我们创建了一个 `ConcreteSubject` 对象和两个 `ConcreteObserver` 对象,并将它们绑定在一起。我们通过调用 `setData()` 方法来改变主题对象的数据,并观察观察者对象是否收到通知。最后,我们将其中一个观察者对象从主题对象中解绑,再次调用 `setData()` 方法,观察是否只有一个观察者对象收到了通知。