观察者模式是一种设计模式,定义了对象之间的一对多关系。当一个对象状态发生改变时,它的依赖者都会收到通知并自动更新。在C++11中,可以通过以下方式实现观察者模式:
首先,我们需要创建一个观察者接口,其中包含一个更新方法。这个接口可以被多个观察者类实现,从而实现多态。
#include <iostream>
#include <functional>
#include <vector>
using namespace std;
class Observer {
public:
virtual void update() = 0;
};
class Subject {
private:
vector<unique_ptr<Observer>> observers;
public:
void registerObserver(unique_ptr<Observer> obs) {
observers.push_back(move(obs));
}
void removeObserver(unique_ptr<Observer> obs) {
observers.erase(remove(observers.begin(), observers.end(), obs), observers.end());
}
void notifyObservers() {
for (auto& obs : observers) {
obs->update();
}
}
};
接下来,我们可以创建一个具体的观察者类,它实现观察者接口,并注册到主题对象中。
class ConcreteObserver : public Observer {
public:
ConcreteObserver(Subject& subject) : subject_(subject) {
subject.registerObserver(make_unique<ConcreteObserver>(*this));
}
void update() override {
// do something based on the subject's state
cout << "Subject state has changed!" << endl;
}
private:
Subject& subject_;
};
现在,我们可以创建一个主题对象,并注册多个观察者对象。当主题对象的状态发生改变时,它会通知所有的观察者对象。
int main() {
Subject subject;
ConcreteObserver observer1(subject);
ConcreteObserver observer2(subject);
// ... more observers ...
subject.notifyObservers(); // initial notification or state change
return 0;
}
在上面的例子中,我们使用了C++11的一些特性,如auto关键字推断类型、unique_ptr智能指针和范围for循环。这样可以使代码更加简洁、安全和易于维护。
标签:11,void,观察者,C++,observers,unique,obs,subject From: https://blog.51cto.com/daniusdk/6663874