C++ 写一个观察者模式
时间: 2023-11-14 12:24:56 浏览: 39
观察者模式(Observer Pattern)是一种常用的设计模式,它用于实现一个对象与多个对象之间的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知并自动更新。下面是一个简单的 C++ 实现示例:
```c++
#include <iostream>
#include <vector>
// 抽象主题类
class Subject {
public:
virtual void Attach(Observer* observer) = 0;
virtual void Detach(Observer* observer) = 0;
virtual void Notify() = 0;
virtual int GetState() = 0;
virtual void SetState(int state) = 0;
};
// 具体主题类
class ConcreteSubject : public Subject {
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);
break;
}
}
}
void Notify() override {
for (auto observer : m_observers) {
observer->Update();
}
}
int GetState() override {
return m_state;
}
void SetState(int state) override {
m_state = state;
}
private:
std::vector<Observer*> m_observers;
int m_state;
};
// 抽象观察者类
class Observer {
public:
Observer(Subject* subject) : m_subject(subject) {}
virtual void Update() = 0;
protected:
Subject* m_subject;
};
// 具体观察者类
class ConcreteObserver : public Observer {
public:
ConcreteObserver(Subject* subject) : Observer(subject) {}
void Update() override {
std::cout << "Observer updated! New state: " << m_subject->GetState() << std::endl;
}
};
int main() {
ConcreteSubject subject;
ConcreteObserver observer1(&subject);
ConcreteObserver observer2(&subject);
subject.Attach(&observer1);
subject.Attach(&observer2);
subject.SetState(1);
subject.Notify();
subject.Detach(&observer1);
subject.SetState(2);
subject.Notify();
return 0;
}
```
在上面的示例中,`Subject` 是抽象主题类,其中定义了三个纯虚函数:`Attach`、`Detach` 和 `Notify`,它们分别用于注册观察者、注销观察者和通知观察者。`ConcreteSubject` 是具体主题类,实现了 `Subject` 中定义的三个纯虚函数,同时还定义了一个私有成员变量 `m_observers`,用于保存注册的观察者列表,以及一个私有成员变量 `m_state`,用于保存主题的状态。
`Observer` 是抽象观察者类,其中定义了一个纯虚函数 `Update`,用于在主题状态发生改变时更新观察者。`ConcreteObserver` 是具体观察者类,实现了 `Observer` 中定义的 `Update` 函数,同时还定义了一个构造函数,用于将主题对象传递给观察者对象。
在 `main` 函数中,我们首先创建了一个 `ConcreteSubject` 对象 `subject`,然后创建了两个 `ConcreteObserver` 对象 `observer1` 和 `observer2`,并将它们注册到 `subject` 对象中。接着,我们调用了 `subject.SetState(1)` 来改变主题的状态,并调用了 `subject.Notify()` 来通知观察者更新状态。然后,我们从 `subject` 对象中注销了 `observer1`,再次改变主题的状态并通知观察者。
运行上面的代码,输出结果如下:
```
Observer updated! New state: 1
Observer updated! New state: 1
Observer updated! New state: 2
```
可以看到,当主题状态发生改变时,所有注册的观察者都得到了通知并更新了状态。这就是观察者模式的作用。