C++如何实现观察者模式_C++设计模式与观察者模式实现


观察者模式通过定义一对多依赖关系,使被观察者状态变化时能自动通知所有观察者。在C++中,Subject类维护Observer列表并提供注册、注销和通知方法,Observer接口定义更新操作。示例中TemperatureSensor作为具体被观察者,当温度改变时调用notifyObservers通知所有Display观察者,后者根据新温度更新显示。该模式利用多态和指针管理实现松耦合,适用于GUI事件、消息系统等场景,关键在于明确发布者与订阅者角色,确保接口清晰、数据及时同步。

观察者模式是一种行为设计模式,用于在对象之间定义一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会自动收到通知并更新。在C++中实现观察者模式,通常涉及两个核心角色:被观察者(Subject)和观察者(Observer)。

观察者模式的基本结构

要实现观察者模式,首先需要定义抽象接口:

  • Subject(被观察者):维护一个观察者列表,提供注册、注销和通知观察者的方法。
  • Observer(观察者):定义一个更新接口,被观察者状态变化时调用该接口。

具体类继承这些接口,并实现相应逻辑。下面是一个简单的C++实现示例。

C++代码实现

以下是使用C++实现观察者模式的典型方式:

// Observer 接口
class Observer {
public:
   virtual ~Observer() = default;
   virtual void update(float temperature) = 0;
};

// Subject 抽象类
class Subject {
private:
   std::vector> observers;
protected:
   void notifyObservers(float temperature) {
      for (auto obs : observers) {
         obs->update(temperature);
      }
   }
public:
   virtual ~Subject() = default;
   void attach(Observer o) {
      observers.push_back(o);
   }
   void detach(Observer o) {
      observers.erase(std::remove(observers.begin(), observers.end(), o), observers.end());
   }
};

// 具体被观察者:温度传感器
class TemperatureSensor : public Subject {
private:
   float temperature;
public:
   void setTemperature(float temp) {
      temperature = temp;
      notifyObservers(temperature);
   }
};

// 具体观察者:显示设备
class Display : public Observer {
private:
   std::string name;
public:
   Display(const std::string& n) : name(n) {}
   void update(float temperature) override {
      std::cout
   }
};

// 使用示例
int main() {
   TemperatureSensor sensor;
   Display display1("室内屏");
   Display display2("室外屏");

   sensor.attach(&display1);
   sensor.attach(&display2);

   sensor.setTemperature(25.5f);
   sensor.setTemperature(26.0f);

   sensor.detach(&display2);
   sensor.setTemperature(27.0f);

   return 0;
}

关键点说明

上述实现有几个需要注意的地方:

  • 使用纯虚函数定义接口,保证多态性。
  • Subject 中保存的是 Observer 指针,避免复制问题。
  • detach 操作使用 std::remove 配合 erase 实现安全删除。
  • notify 调用发生在状态变更后,确保观察者获取最新数据。

这种模式适合解耦事件源和响应逻辑,常用于GUI事件处理、消息系统或传感器数据分发等场景。

基本上就这些。只要理清谁是发布者、谁是订阅者,接口定义清晰,C++中的观察者模式并不难实现。


# ai  # c++  # String  # Float  # for  # 多态  # const  # auto  # int  # void  # 指针  # 继承  # 虚函数  # 纯虚函数  # 接口  # class  # public  # private  # protected  # 对象  # 事件  # default  # display  # 传感器  # 谁是  # 的是  # 是一个  # 是一种  # 适用于  # 有几个  # 需要注意  # 关键在于  # 外屏  # 并不难 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 网络优化76771 】 【 技术知识130152 】 【 IDC云计算60162 】 【 营销推广131313 】 【 AI优化88182 】 【 百度推广37138 】 【 网站推荐60173 】 【 精选阅读31334


相关推荐: 如何使用Golang匿名函数_快速定义临时函数逻辑  Win11怎么制作U盘启动盘_Win11原版系统安装盘制作【详解】  如何高效获取循环末次生成的 NumPy 数组最后一个元素(无需额外循环)  Python大型项目拆分策略_模块化解析【教程】  如何使用Golang理解结构体指针方法接收者_Golang修改字段实践  如何使用Golang实现Web表单数据绑定_自动映射字段到结构体  Win11怎么设置任务栏大小_Windows11注册表修改TaskbarSi值  MAC怎么解压RAR格式文件_MAC第三方解压工具安装与压缩包管理【教程】  c++20的std::format怎么用 比printf更安全高效的格式化方法【详解】  php怎么捕获异常_trycatch结构处理运行时错误的技巧【方法】  如何在Golang中定义接口_抽象方法和多态实现  Python正则表达式实战_模式匹配说明【教程】  如何使用Golang编写单元测试_创建Test函数验证业务逻辑  短链接怎么用php递归还原_多层加密链接的处理法【详解】  Python对象生命周期管理_创建销毁说明【指导】  如何自定义Windows终端的默认配置文件?(PowerShell/CMD)  用Python构建微服务架构实践_FastAPI与Django对比详解  php查询数据怎么分组_groupby分组查询配合聚合函数【技巧】  Drupal 中 HTML 链接被重复转义导致渲染异常的解决方案  Win11如何设置开机问候语 Win11修改登录界面提示【技巧】  Win11怎么开启游戏工具栏_Windows11 Xbox Game Bar快捷键  Python网络日志追踪_请求定位解析【教程】  Win10闹钟铃声怎么自定义 Win10闹钟自定义铃声教程【方法】  Win11怎样安装钉钉客户端_Win11安装钉钉教程【步骤】  如何在Golang中捕获结构体方法错误_Golang方法返回error处理实践  Win11时间怎么同步到原子钟 Win11高精度时间同步设置【指南】  Mac的Time Machine怎么用_Mac系统备份与数据恢复【完整指南】  Ajax提交表单PHP怎么接收_处理Ajax发送的表单数据技巧【指南】  Win11怎么退出微软账户_切换Win11为本地账户登录方法【详解】  如何在 Go 中创建包含映射(map)的切片(slice)结构  Win10路由器怎么隐藏ssid Win10隐藏wifi名称设置【指南】  Win11怎么更改任务栏位置_修改注册表将Win11任务栏置顶【教程】  Win11怎么关闭自动调节亮度_Windows11禁用内容自适应亮度  Windows10系统服务优化指南_Win10禁用不必要服务提升性能  Win11蓝牙开关不见了怎么办_Win11蓝牙驱动丢失修复教程【方法】  如何使用Golang实现文件加密_Golang crypto 文件加密示例  windows系统找不到无线网络怎么办_windows WLAN适配器故障排查  ACF 教程:正确更新嵌套在多层 Group 字段内的子字段  Python大文件处理策略_内存优化说明【指导】  php485能和物联网模块通信吗_php485对接NB-IoT模块实例【说明】  如何在Golang中优化文件读写性能_使用缓冲和并发处理  Win11如何设置环境变量 Win11添加和修改系统与用户变量【教程】  Python文件管理规范_工程实践说明【指导】  Windows11如何设置专注助手_Windows11专注助手使用攻略【技巧】  Mac怎么安装软件_Mac安装dmg与pkg文件的区别【指南】  c++怎么操作redis数据库_c++ hiredis库连接与命令执行【实战】  VSC怎样在Linux运行PHP_Ubuntu系统配置步骤【操作】  c++怎么实现大文件的分块读写_c++ 文件指针seekp与seekg偏移控制【方法】  Win11怎么把图标拖到任务栏_Win11固定应用快捷方式指南【方法】  win11 OneDrive怎么彻底关闭 Win11禁用并卸载OneDrive教程【分享】 

 2025-11-21

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.