observer 设计模式 code c++
时间: 2024-04-09 19:29:10 浏览: 59
下是一个使用观察者(Observer)设计模式的示例代码(C++):
```cpp
#include <iostream>
#include <vector>
// 观察者接口
class Observer {
public:
virtual void update(const std::string& message) = 0;
};
// 具体观察者A
class ConcreteObserverA : public Observer {
public:
void update(const std::string& message) override {
std::cout << "具体观察者A收到消息:" << message << std::endl;
}
};
// 具体观察者B
class ConcreteObserverB : public Observer {
public:
void update(const std::string& message) override {
std::cout << "具体观察者B收到消息:" << message << std::endl;
}
};
// 被观察者(主题)类
class Subject {
private:
std::vector<Observer*> observers;
std::string message;
public:
void attach(Observer* observer) {
observers.push_back(observer);
}
void detach(Observer* observer) {
for (auto it = observers.begin(); it != observers.end(); ++it) {
if (*it == observer) {
observers.erase(it);
break;
}
}
}
void notify() {
for (auto observer : observers) {
observer->update(message);
}
}
void setMessage(const std::string& newMessage) {
message = newMessage;
notify();
}
};
// 客户端代码
int main() {
// 创建具体观察者对象
Observer* observerA = new ConcreteObserverA();
Observer* observerB = new ConcreteObserverB();
// 创建被观察者对象
Subject subject;
// 注册观察者
subject.attach(observerA);
subject.attach(observerB);
// 设置消息并通知观察者
subject.setMessage("Hello World!");
// 取消注册观察者B
subject.detach(observerB);
// 设置新消息并通知观察者
subject.setMessage("Goodbye!");
delete observerA;
delete observerB;
return 0;
}
```
在上述示例代码中,我们定义了一个观察者接口 `Observer`,并要求具体的观察者类继承并实现该接口。具体的观察者类 `ConcreteObserverA` 和 `ConcreteObserverB` 分别定义了不同的更新行为。
被观察者(主题)类 `Subject` 包含一个观察者列表,并提供了注册、注销和通知观察者的方法。通过调用 `notify()` 方法,被观察者会遍历观察者列表,并调用每个观察者的 `update()` 方法来传递消息。
在客户端代码中,我们创建了具体的观察者对象,并将它们注册到被观察者中。然后,通过设置消息并调用被观察者的 `setMessage()` 方法来通知观察者。在示例中,我们设置了两条消息,并在第二条消息后注销了一个观察者。
运行代码将输出每个观察者收到的消息。
这个示例展示了观察者设计模式的基本结构和使用方式,并在 C++ 中实现了它。通过使用观察者模式,可以实现对象之间的松耦合,当一个对象的状态发生变化时,它的所有观察者都会得到通知并进行相应的处理。记得在程序结束时删除动态分配的内存。
阅读全文