/*
观察者模式是一种常用的设计模式,用于在对象之间建立一种一对多的依赖关系,当被观察的对象发生变化时,
所有依赖于它的对象都能够得到通知并自动更新。下面是一个使用C++实现观察者模式的例子:
*/#include <iostream>
#include <vector>// 定义观察者接口
class Observer {
public:virtual void update(int value) = 0;
};// 定义被观察者接口
class Subject {
public:virtual void attach(Observer* observer) = 0;virtual void detach(Observer* observer) = 0;virtual void notify() = 0;
};// 具体的被观察者实现
class ConcreteSubject : public Subject {
private:int m_value;std::vector<Observer*> m_observers;public:void attach(Observer* observer) override {m_observers.push_back(observer);}void detach(Observer* observer) override {for (auto it = m_observers.begin(); it != m_observers.end(); ++it) {if (*it == observer) {m_observers.erase(it);break;}}}void notify() override {for (auto observer : m_observers) {observer->update(m_value);}}void setValue(int value) {m_value = value;notify();}
};// 具体的观察者实现
class ConcreteObserver : public Observer {
public:void update(int value) override {std::cout << "Value changed to " << value << std::endl;}
};int main() {ConcreteSubject subject;ConcreteObserver observer1;ConcreteObserver observer2;// 将观察者添加到被观察者的观察列表中subject.attach(&observer1);subject.attach(&observer2);// 修改被观察者的值,观察者将会收到通知subject.setValue(3);// 将观察者从被观察者的观察列表中移除subject.detach(&observer2);// 再次修改被观察者的值,只有observer1会收到通知subject.setValue(5);return 0;
}/*
在这个例子中,Subject是被观察者的接口,ConcreteSubject是具体的被观察者实现,Observer是观察者的接口,ConcreteObserver是具体的观察者实现。
ConcreteSubject中维护了一个观察列表,可以动态地添加和移除观察者。当被观察者的值发生改变时,它会调用notify方法来通知所有的观察者。
在main函数中,我们创建了一个ConcreteSubject对象和两个ConcreteObserver对象,将它们添加到观察列表中,并修改被观察者的值来测试观察者模式的实现。
*/
1. 运行结果