返回
C++17 中的观察者模式:简明扼要
见解分享
2023-12-24 06:57:03
C++17 中的观察者模式:一览
引言
在软件开发中,观察者模式是一种设计模式,它通过订阅-发布机制使对象之间通信。当对象(称为被观察者)的状态发生变化时,它会通知所有已注册的观察者。观察者可以相应地采取行动,例如更新其状态或执行某些任务。
观察者模式的优势
观察者模式提供了许多优点,使其成为各种应用程序中软件设计的宝贵工具:
- 松散耦合: 观察者与被观察者之间的耦合非常松散。观察者不必知道被观察者的具体实现细节,反之亦然。这使得系统更易于维护和扩展。
- 可观察性: 观察者模式提供了一个方便的机制来观察对象的内部状态。这对于调试、监视和测试非常有用。
- 事件管理: 观察者模式提供了一种结构化的方式来管理事件。它允许对象将事件发布到系统中,并确保所有感兴趣的观察者都能收到通知。
C++17 中的观察者模式实现
C++17 引入了标准库支持的观察者模式。它通过 std::observable
和 std::observer
类实现。
1. 被观察者(std::observable
)
std::observable
类表示被观察者。它提供了以下功能:
- 订阅观察者:
subscribe()
方法允许观察者注册以接收通知。 - 通知观察者:
notify_observers()
方法通知所有注册的观察者,并传递一个可选参数以提供有关状态更改的信息。 - 取消订阅观察者:
unsubscribe()
方法允许观察者取消注册,不再接收通知。
2. 观察者(std::observer
)
std::observer
类表示观察者。它定义了以下接口:
observer()
: 该方法在每次被观察者状态发生更改时被调用。它接收一个参数,提供有关状态更改的信息。
3. 示例代码
以下示例代码演示了如何使用 C++17 标准库实现观察者模式:
#include <iostream>
#include <vector>
#include <optional>
#include <functional>
using namespace std;
class Subject {
public:
void addObserver(function<void(int)> observer) {
observers.push_back(observer);
}
void removeObserver(function<void(int)> observer) {
observers.erase(remove(observers.begin(), observers.end(), observer), observers.end());
}
void notifyObservers(int value) {
for (const auto& observer : observers) {
observer(value);
}
}
private:
vector<function<void(int)>> observers;
};
class Observer {
public:
Observer(Subject& subject) : subject(subject) {
subject.addObserver(bind(&Observer::update, this, placeholders::_1));
}
~Observer() {
subject.removeObserver(bind(&Observer::update, this, placeholders::_1));
}
void update(int value) {
cout << "Observer received value: " << value << endl;
}
private:
Subject& subject;
};
int main() {
Subject subject;
Observer observer1(subject);
Observer observer2(subject);
subject.notifyObservers(42);
return 0;
}
总结
C++17 中的观察者模式是一个强大的工具,可以简化对象之间的松散耦合、可观察性和事件管理。通过使用 std::observable
和 std::observer
类,开发者可以轻松地在他们的应用程序中实现这种模式。