用C++写一段观察者模式
时间: 2023-11-14 14:47:31 浏览: 30
当然可以!以下是一个简单的观察者模式的实现示例:
```cpp
#include <iostream>
#include <vector>
// 抽象观察者
class Observer {
public:
virtual void update(int data) = 0;
};
// 具体观察者A
class ConcreteObserverA : public Observer {
public:
void update(int data) override {
std::cout << "ConcreteObserverA received update: " << data << std::endl;
}
};
// 具体观察者B
class ConcreteObserverB : public Observer {
public:
void update(int data) override {
std::cout << "ConcreteObserverB received update: " << data << std::endl;
}
};
// 抽象主题
class Subject {
protected:
std::vector<Observer*> observers;
public:
virtual void attach(Observer* observer) = 0;
virtual void detach(Observer* observer) = 0;
virtual void notify(int data) = 0;
};
// 具体主题
class ConcreteSubject : public Subject {
public:
void attach(Observer* observer) override {
observers.push_back(observer);
}
void detach(Observer* observer) override {
for (auto it = observers.begin(); it != observers.end(); ++it) {
if (*it == observer) {
observers.erase(it);
break;
}
}
}
void notify(int data) override {
for (auto observer : observers) {
observer->update(data);
}
}
};
int main() {
// 创建主题和观察者
ConcreteSubject subject;
ConcreteObserverA observerA;
ConcreteObserverB observerB;
// 注册观察者
subject.attach(&observerA);
subject.attach(&observerB);
// 发送更新通知
subject.notify(1);
// 移除一个观察者
subject.detach(&observerA);
// 再次发送更新通知
subject.notify(2);
return 0;
}
```
在这个示例中,我们首先定义了抽象观察者(`Observer`)和具体观察者(`ConcreteObserverA`和`ConcreteObserverB`)。然后我们定义了抽象主题(`Subject`)和具体主题(`ConcreteSubject`)。在具体主题中,我们实现了观察者的注册、移除和通知功能。
在`main`函数中,我们创建了一个具体主题对象和两个具体观察者对象。然后我们通过调用`attach`方法将观察者注册到主题中。接着,我们使用`notify`方法发送更新通知给所有观察者。最后,我们使用`detach`方法移除一个观察者,并再次发送更新通知。
当运行这段代码时,你会看到输出结果类似于:
```
ConcreteObserverA received update: 1
ConcreteObserverB received update: 1
ConcreteObserverB received update: 2
```
这表明观察者模式成功地将更新通知传递给了所有注册的观察者。希望这个示例对你有帮助!如果有任何问题,请随时提问。