当前位置: 首页 > 网络知识

C++设计模式之观察者模式

时间:2026-01-27 08:40:02

设计模式之观察者模式


观察者模式定义了一种一对多的依赖关系,让多个观察者同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。其UML图如下:

在ConcretSubject内部有一个Observer的列表,当Subject的状态发生改变时,会通知列表内的所有的观察者。而观察者都实现了统一的接口,而不同的观察者在该接口中做出了不同的响应。其示例代码如下:

1 // ObserverModel.h文件 2 #pragma once 3 #include <iostream> 4 #include <vector> 5 #include <string> 6 #include <algorithm> 7 // 观察者 8 class Observer 9 ; 13 14 class ConcreteObserver_0 : public Observer 15 21 }; 22 23 class ConcreteObserver_1 : public Observer 24 30 }; 31 // 通知者 32 class Subject 33 43 44 protected: 45 std::string m_str; 46 }; 47 // 传统观察者模式 48 class ConcreteSubject : public Subject 49 55 ~ConcreteSubject() 56 59 virtual void Attatch(Observer * p) 60 virtual void Detach(Observer * p) 64 70 } 71 virtual void Notify() 72 78 } 79 private: 80 std::vector<Observer * > m_vec; 81 };

测试代码如下:

1 #include <iostream> 2 #include "ObserverModel.h" 3 4 int main() 5

测试结果如下图:

  观察者模式也有不足,观察者模式需要观察者需要实现相同的接口。但是如果已经些好的类或者第三方的类库则就没办法实现该功能了。所以可以稍稍改进一下,就是把Subject类中的关于观察者的列表修改为函数指针的列表。示例码如下:

1 // ObserverModel.h文件 2 #pragma once 3 #include <iostream> 4 #include <vector> 5 #include <string> 6 #include <algorithm> 7 // 函数指针版本 8 class ConcreteObserverFunc_0 9 15 }; 16 17 class ConcreteObserverFunc_1 18 24 }; 25 26 class SubjectFunc 27 37 protected: 38 std::string m_str; 39 }; 40 41 class ConcreteSubjectFunc : public SubjectFunc 42 50 ~ConcreteSubjectFunc() 51 54 virtual void Attatch(void (*p)()) 55 58 virtual void Detach(void(*p)()) 59 65 } 66 virtual void Notify() 67 73 } 74 };

测试代码如下:

1 #include <iostream> 2 #include "ObserverModel.h" 3 4 int main() 5

测试结果如下图:



上一篇:C++ 设计模式之建造者模式
下一篇:C++ 设计模式之抽象工厂模式
  • 英特尔与 Vertiv 合作开发液冷 AI 处理器
  • 英特尔第五代 Xeon CPU 来了:详细信息和行业反应
  • 由于云计算放缓引发扩张担忧,甲骨文股价暴跌
  • Web开发状况报告详细介绍可组合架构的优点
  • 如何使用 PowerShell 的 Get-Date Cmdlet 创建时间戳
  • 美光在数据中心需求增长后给出了强有力的预测
  • 2027服务器市场价值将接近1960亿美元
  • 生成式人工智能的下一步是什么?
  • 分享在外部存储上安装Ubuntu的5种方法技巧
  • 全球数据中心发展的关键考虑因素
  • 英特尔与 Vertiv 合作开发液冷 AI 处理器

    英特尔第五代 Xeon CPU 来了:详细信息和行业反应

    由于云计算放缓引发扩张担忧,甲骨文股价暴跌

    Web开发状况报告详细介绍可组合架构的优点

    如何使用 PowerShell 的 Get-Date Cmdlet 创建时间戳

    美光在数据中心需求增长后给出了强有力的预测

    2027服务器市场价值将接近1960亿美元

    生成式人工智能的下一步是什么?

    分享在外部存储上安装Ubuntu的5种方法技巧

    全球数据中心发展的关键考虑因素