观察者模式是一种行为设计模式,它定义了对象间的一种一对多的依赖关系,当一个对象改变状态时,所有依赖于它的对象都会得到通知并自动更新。以下是使用C++实现观察者模式的步骤和示例代码:
观察者模式实现步骤:
-
定义观察者接口:创建一个观察者接口,声明一个更新方法,供被观察的对象在状态改变时调用。
-
实现具体观察者:为每个具体的观察者实现观察者接口,定义当接收到通知时的行为。
-
定义主题接口:创建一个主题接口,允许对象注册和注销观察者。
-
实现具体主题:为每个具体的主题实现主题接口,维护观察者列表,并提供方法来通知所有观察者。
-
注册和注销观察者:允许观察者注册到主题,并在不再需要接收通知时注销。
-
通知观察者:当主题的状态改变时,它应该通知所有注册的观察者。
示例代码:
#include <iostream>
#include <vector>
#include <list>
// 观察者接口
class Observer {
public:
virtual void update() = 0;
virtual ~Observer() {}
};
// 具体观察者
class ConcreteObserver : public Observer {
std::string _name;
public:
ConcreteObserver(const std::string& name) : _name(name) {}
void update() override {
std::cout << "Observer " << _name << " is notified." << std::endl;
}
};
// 主题接口
class Subject {
public:
virtual void registerObserver(Observer* observer) = 0;
virtual void removeObserver(Observer* observer) = 0;
virtual void notifyObservers() = 0;
virtual ~Subject() {}
};
// 具体主题
class ConcreteSubject : public Subject {
std::list<Observer*> _observers;
std::string _state;
public:
void setState(const std::string& state) {
_state = state;
notifyObservers();
}
std::string getState() const {
return _state;
}
void registerObserver(Observer* observer) override {
_observers.push_back(observer);
}
void removeObserver(Observer* observer) override {
_observers.remove(observer);
}
void notifyObservers() override {
for (Observer* observer : _observers) {
observer->update();
}
}
};
int main() {
ConcreteSubject subject;
ConcreteObserver observer1("1");
ConcreteObserver observer2("2");
subject.registerObserver(&observer1);
subject.registerObserver(&observer2);
subject.setState("New State 1"); // 通知所有观察者状态改变
subject.removeObserver(&observer1);
subject.setState("New State 2"); // 只有observer2会被通知
return 0;
}
在这个例子中,ConcreteSubject
是主题,它维护了一个观察者列表,并且在状态改变时通知所有观察者。ConcreteObserver
是观察者,实现了update
方法来定义接收到通知时的行为。main
函数展示了如何注册和注销观察者,以及如何触发通知。
观察者模式非常适合于实现分布式事件处理系统,如GUI界面更新、消息系统等场景。
分享一个有趣的 学习链接