返回

C++17 中的观察者模式:简明扼要

见解分享

C++17 中的观察者模式:一览

引言

在软件开发中,观察者模式是一种设计模式,它通过订阅-发布机制使对象之间通信。当对象(称为被观察者)的状态发生变化时,它会通知所有已注册的观察者。观察者可以相应地采取行动,例如更新其状态或执行某些任务。

观察者模式的优势

观察者模式提供了许多优点,使其成为各种应用程序中软件设计的宝贵工具:

  • 松散耦合: 观察者与被观察者之间的耦合非常松散。观察者不必知道被观察者的具体实现细节,反之亦然。这使得系统更易于维护和扩展。
  • 可观察性: 观察者模式提供了一个方便的机制来观察对象的内部状态。这对于调试、监视和测试非常有用。
  • 事件管理: 观察者模式提供了一种结构化的方式来管理事件。它允许对象将事件发布到系统中,并确保所有感兴趣的观察者都能收到通知。

C++17 中的观察者模式实现

C++17 引入了标准库支持的观察者模式。它通过 std::observablestd::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::observablestd::observer 类,开发者可以轻松地在他们的应用程序中实现这种模式。