观察者模式是一种行为设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并自动更新
实现:
1.定义一个观察者抽象类,抽象类中有一个update接口,负责修改对象的变化
2.然后需要被通知的类 需要继承该类
- // 观察者接口
- class Observer {
- public:
- virtual void update(const std::string& message) = 0;
- };
-
- // 具体观察者
- class ConcreteObserver : public Observer {
- public:
- ConcreteObserver(const std::string& name) : name(name) {}
-
- void update(const std::string& message) override {
- std::cout << name << "收到通知: " << message << std::endl;
- }
-
- private:
- std::string name;
- };
2. 定义被主题类,主题类发生变化时会通知 观察者对象
- // 主题(被观察者)接口
- class Subject {
- public:
- virtual void attach(Observer* observer) = 0;
- virtual void detach(Observer* observer) = 0;
- virtual void notify(const std::string& message) = 0;
- };
-
- // 具体主题
- class ConcreteSubject : public Subject {
- public:
- void attach(Observer* observer) override {
- observers.push_back(observer);
- }
-
- void detach(Observer* observer) override {
- // 从观察者列表中移除观察者
- for (auto it = observers.begin(); it != observers.end(); ++it) {
- if (*it == observer) {
- observers.erase(it);
- break;
- }
- }
- }
-
- void notify(const std::string& message) override {
- // 通知所有观察者
- for (Observer* observer : observers) {
- observer->update(message);
- }
- }
-
- private:
- std::vector
observers; - };
实例:
- int main() {
- ConcreteSubject subject;
-
- ConcreteObserver observer1("观察者1");
- ConcreteObserver observer2("观察者2");
-
- subject.attach(&observer1);
- subject.attach(&observer2);
-
- subject.notify("Hello, 观察者们!");
-
- }