什么是观察者模式?
观察者模式是一种一对多的以来关系,当一个对象的状态发生改变时,所有依赖于他的对象都得到通知并被自动更新。它的主体是通知的发布者,发出通知时并不需要知道谁是它的观察者,可以有任意数目的观察者订阅并接收通知,将观察者和被观察的对象分离开。
废话不多说,上代码:
#include <iostream> #include <vector> using namespace std; // 观察者接口 class Observer { public: virtual void update() = 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: vector<Observer*> observers; public: void attach(Observer* observer) { observers.push_back(observer); } void detach(Observer* observer) { for (int i = 0; i < observers.size(); i++) { if (observers[i] == observer) { observers.erase(observers.begin() + i); break; } } } void notify() { for (int i = 0; i < observers.size(); i++) { observers[i]->update(); } } void stateChanged() { notify(); } }; // 具体观察者实现 class ConcreteObserver : public Observer { private: Subject* subject; public: ConcreteObserver(Subject* subject) { this->subject = subject; subject->attach(this); } ~ConcreteObserver() { subject->detach(this); } void update() { // 观察者收到通知后执行的操作 cout << "Subject changed!" << endl; } }; int main() { ConcreteSubject subject; ConcreteObserver observer1(&subject); ConcreteObserver observer2(&subject); ConcreteObserver observer3(&subject); subject.stateChanged(); // 触发通知,观察者更新 return 0; }
在上面的代码中,Observer是观察者接口,Subject是主题接口。ConcreteSubject是具体的主题实现,它维护一个观察者列表,并在状态改变时通知所有观察者。ConcreteObserver是具体的观察者实现,它在被通知时执行特定的操作。
在主函数中,我们创建了一个ConcreteSubject实例,并将三个ConcreteObserver实例附加到该主题上。然后,当主题的状态改变时,所有附加的观察者都会收到通知并执行相应的操作。