观察者模式(C++实现)

avatar
作者
筋斗云
阅读量:0

观察者模式(Observer Pattern)是一种行为设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并自动更新

观察者模式的核心思想

观察者模式通过分离观察者和被观察者(也称为主题或发布者),实现了对象之间的松耦合。被观察者维护一组观察者对象,并提供添加、删除和通知观察者的方法。观察者对象通过注册到被观察者上,当被观察者状态发生变化时,通知观察者执行相应的更新操作。

观察者模式的角色

观察者模式包括以下角色:

  1. 被观察者(Subject):也称为主题或发布者,维护一组观察者对象,提供方法用于注册、删除和通知观察者。
  2. 观察者(Observer):定义一个更新接口,当被观察者状态发生变化时,被通知执行相应的更新操作。
  3. 具体被观察者(Concrete Subject):实现被观察者接口,维护观察者对象列表,并在状态发生变化时通知观察者。
  4. 具体观察者(Concrete Observer):实现观察者接口,定义具体的更新行为。
观察者模式的优点
  1. 松耦合:被观察者和观察者之间解耦,减少对象之间的直接依赖。
  2. 可扩展性:可以轻松添加新的观察者和被观察者,而不影响现有代码。
  3. 可重用性:观察者模式使得被观察者和观察者之间的交互变得灵活,可以在不同的场景中重用。
代码实现
#include <iostream> #include <vector>  // 观察者接口 class Observer { public:     virtual void update() = 0; };  // 具体观察者 class ConcreteObserver : public Observer { public:     void update() override {         std::cout << "Received update notification." << std::endl;     } };  // 被观察者接口 class Subject { private:     std::vector<Observer*> observers;  public:     void attach(Observer* observer) {         observers.push_back(observer);     }      void detach(Observer* observer) {         auto it = std::find(observers.begin(), observers.end(), observer);         if (it != observers.end()) {             observers.erase(it);         }     }      void notify() {         for (Observer* observer : observers) {             observer->update();         }     } };  // 具体被观察者 class ConcreteSubject : public Subject { public:     void doSomething() {         // 做一些事情...         // 当状态发生改变时通知观察者         notify();     } };  int main() {     ConcreteObserver observer1;     ConcreteObserver observer2;      ConcreteSubject subject;     subject.attach(&observer1);     subject.attach(&observer2);      // 被观察者状态改变时,通知观察者     subject.doSomething();      return 0; } 

在这个示例中,ConcreteSubject 是具体的被观察者,继承自 Subject 接口。ConcreteObserver 是具体的观察者,继承自 Observer 接口。main 函数中,创建了两个观察者对象并注册到被观察者中,当被观察者的状态发生变化时,通知观察者执行相应的更新操作。

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!