观察者模式是一种行为设计模式,其中一个对象(主题)维护其依赖对象(观察者)的列表,当主题的状态发生变化时,它通知所有观察者。以下是一个使用C++11实现观察者模式的简单例子:
- 定义观察者接口(Observer): 创建一个观察者接口,该接口包含观察者需要实现的更新方法。这个接口可以包含其他方法,但更新方法是必须的。
- 创建具体观察者类: 实现观察者接口的具体类。每个具体观察者类都应该实现更新方法,该方法定义了在主题状态变化时观察者应该执行的操作。
- 定义主题接口(Subject): 创建一个主题接口,该接口包含了添加、移除和通知观察者的方法。这里可以选择在主题接口中定义更新状态的方法,也可以在具体主题类中定义。
- 创建具体主题类: 实现主题接口的具体类。该类应该维护一个观察者列表,并在状态变化时通知所有观察者。
- 实现客户端代码: 在客户端代码中创建具体的主题和观察者对象,将观察者添加到主题中。客户端还负责触发主题状态的变化,从而通知观察者。
下面是对上述步骤的更详细的讲解:
步骤 1:定义观察者接口
// Observer.h #pragma once class Observer { public: virtual void update(int data) = 0; };
步骤 2:创建具体观察者类
// ConcreteObserverA.h #pragma once #include <iostream> #include "Observer.h" class ConcreteObserverA : public Observer { public: void update(int data) override { std::cout << "Observer A 收到更新,数据为: " << data << std::endl; } };
// ConcreteObserverB.h #pragma once #include <iostream> #include "Observer.h" class ConcreteObserverB : public Observer { public: void update(int data) override { std::cout << "Observer B 收到更新,数据为: " << data << std::endl; } };
步骤 3:定义主题接口
// Subject.h #pragma once #include "Observer.h" class Subject { public: virtual void addObserver(Observer* observer) = 0; virtual void removeObserver(Observer* observer) = 0; virtual void notifyObservers(int data) = 0; };
步骤 4:创建具体主题类
// ConcreteSubject.h #pragma once #include <vector> #include "Subject.h" class ConcreteSubject : public Subject { private: std::vector<Observer*> observers; int data; public: void addObserver(Observer* observer) override { observers.push_back(observer); } void removeObserver(Observer* observer) override { observers.erase(std::remove(observers.begin(), observers.end(), observer), observers.end()); } void notifyObservers(int data) override { for (Observer* observer : observers) { observer->update(data); } } void setData(int newData) { data = newData; notifyObservers(data); } int getData() const { return data; } };
步骤 5:实现客户端代码
// main.cpp #include "ConcreteObserverA.h" #include "ConcreteObserverB.h" #include "ConcreteSubject.h" int main() { ConcreteSubject subject; ConcreteObserverA observerA; ConcreteObserverB observerB; subject.addObserver(&observerA); subject.addObserver(&observerB); subject.setData(123); subject.removeObserver(&observerA); subject.setData(456); return 0; }
在这个例子中,我们创建了抽象观察者类 Observer,具体观察者类 ConcreteObserverA 和 ConcreteObserverB。然后,我们定义了抽象主题类 Subject 和具体主题类 ConcreteSubject。最后,在客户端代码中,我们创建了具体的主题和观察者对象,将观察者添加到主题中,并演示了状态变化时如何通知观察者,以及如何移除观察者。
原文地址:https://www.toutiao.com/article/7305927309276791335/