用C++写一段观察者模式,需要用到函数回调
时间: 2024-04-16 19:26:33 浏览: 22
当然可以!以下是一个使用函数回调的观察者模式的实现示例:
```cpp
#include <iostream>
#include <functional>
#include <vector>
// 定义观察者类型
typedef std::function<void(int)> Observer;
// 主题
class Subject {
private:
std::vector<Observer> observers;
public:
void attach(const Observer& observer) {
observers.push_back(observer);
}
void detach(const Observer& observer) {
for (auto it = observers.begin(); it != observers.end(); ++it) {
if (*it == observer) {
observers.erase(it);
break;
}
}
}
void notify(int data) {
for (auto observer : observers) {
observer(data);
}
}
};
// 具体观察者
class ConcreteObserver {
public:
void update(int data) {
std::cout << "ConcreteObserver received update: " << data << std::endl;
}
};
int main() {
// 创建主题和观察者
Subject subject;
ConcreteObserver observer;
// 注册观察者
subject.attach([&observer](int data) { observer.update(data); });
// 发送更新通知
subject.notify(1);
// 移除观察者
subject.detach([&observer](int data) { observer.update(data); });
// 再次发送更新通知
subject.notify(2);
return 0;
}
```
在这个示例中,我们使用`std::function`类型定义了观察者类型`Observer`,它可以接受一个整数参数。主题类`Subject`中的`attach`和`detach`方法接受一个函数回调作为观察者的注册和移除操作。`notify`方法通过调用观察者的函数回调来通知观察者。
在`main`函数中,我们创建了一个主题对象和一个具体观察者对象。我们使用`attach`方法将观察者的函数回调注册到主题中。然后,我们使用`notify`方法发送更新通知给所有观察者。最后,我们使用`detach`方法移除观察者的函数回调,并再次发送更新通知。
当运行这段代码时,你会看到输出结果类似于:
```
ConcreteObserver received update: 1
```
这表明观察者模式成功地将更新通知传递给了注册的观察者。希望这个示例对你有帮助!如果有任何问题,请随时提问。