观察者模式(C++实现)
创始人
2025-02-11 03:03:00
0

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

观察者模式的核心思想

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

观察者模式的角色

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

  1. 被观察者(Subject):也称为主题或发布者,维护一组观察者对象,提供方法用于注册、删除和通知观察者。
  2. 观察者(Observer):定义一个更新接口,当被观察者状态发生变化时,被通知执行相应的更新操作。
  3. 具体被观察者(Concrete Subject):实现被观察者接口,维护观察者对象列表,并在状态发生变化时通知观察者。
  4. 具体观察者(Concrete Observer):实现观察者接口,定义具体的更新行为。
观察者模式的优点
  1. 松耦合:被观察者和观察者之间解耦,减少对象之间的直接依赖。
  2. 可扩展性:可以轻松添加新的观察者和被观察者,而不影响现有代码。
  3. 可重用性:观察者模式使得被观察者和观察者之间的交互变得灵活,可以在不同的场景中重用。
代码实现
#include  #include   // 观察者接口 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 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 函数中,创建了两个观察者对象并注册到被观察者中,当被观察者的状态发生变化时,通知观察者执行相应的更新操作。

相关内容

热门资讯

透视透视挂!wepoker插件... 透视透视挂!wepoker插件程序激活码,竟然真的是有挂(透视)教你攻略(有挂介绍)1、很好的工具软...
透视玄学"werpl... 透视玄学"werplan有挂吗"好像存在有挂(透视)科技教程(有挂技巧)1、许多玩家不知道werpl...
透视透视!aapoker俱乐部... 透视透视!aapoker俱乐部靠谱吗(透视)发牌逻辑(一直存在有挂);1、每一步都需要思考,不同水平...
透视免费!aa poker辅助... 透视免费!aa poker辅助,原本存在有挂(透视)安装教程(有挂介绍)运aa poker辅助辅助工...
透视辅助!aapoker透视脚... 透视辅助!aapoker透视脚本下载(透视)ai插件(其实存在有挂)1、点击下载安装,aapoker...
透视好牌"wepok... 透视好牌"wepoker破解器"确实真的有挂(透视)必赢教程(有挂技巧)1)wepoker破解器辅助...
透视挂!智星德州有脚本吗,从前... 透视挂!智星德州有脚本吗,从前是真的有挂(透视)力荐教程(有挂细节)1、每一步都需要思考,不同水平的...
透视软件"wpk俱乐... 透视软件"wpk俱乐部辅助器"果然有挂(透视)攻略方法(有挂插件);透视软件"wpk俱乐部辅助器"果...
透视美元局!aapoker辅助... 透视美元局!aapoker辅助器是真的吗(透视)透视脚本下载(确实真的有挂)1、超多福利:超高返利,...
透视透视!hhpoker买挂,... 透视透视!hhpoker买挂,本然是真的有挂(透视)我来教教你(有挂教程)1、hhpoker买挂透视...