新闻中心

c++ 怎么实现一个观察者模式_c++设计模式之观察者模式讲解

2025-11-27
浏览次数:
返回列表
观察者模式通过定义一对多依赖关系,实现对象间松耦合通信。Subject维护Observer列表,状态变化时调用notify通知所有观察者;Observer接口定义update方法,具体观察者如CurrentDisplay实现更新逻辑。示例中WeatherData作为具体被观察者,在setMeasurements后触发notify,向所有注册的观察者广播温度和湿度数据。使用vector存储观察者指针,attach和detach用于动态管理订阅关系。main函数演示了注册观察者并更新数据的过程,输出当前天气条件。实际应用中建议使用智能指针管理生命周期,选用list或set提升删除效率,多线程下对观察者列表加锁保护,并可扩展事件类型支持选择性监听。该模式适用于事件系统、GUI交互和数据监控等场景,利用虚函数与多态机制在C++中高效实现回调通知。

c++ 怎么实现一个观察者模式_c++设计模式之观察者模式讲解

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

观察者模式的核心结构

要实现这个模式,需要定义以下几个关键部分:

  • Subject(被观察者):维护一个观察者列表,提供添加、删除和通知观察者的方法。
  • Observer(观察者):定义一个更新接口,被观察者状态变化时调用。
  • 具体观察者(Concrete Observer):实现更新逻辑,响应被观察者的通知。

基础代码实现

下面是一个简单的C++示例,展示如何实现观察者模式:

// 观察者抽象类 class Observer { public: virtual ~Observer() = default; virtual void update(float temperature, float humidity) = 0; };

// 被观察者抽象类 class Subject { public: virtual ~Subject() = default; virtual void attach(Observer o) = 0; virtual void detach(Observer o) = 0; virtual void notify() = 0; };

// 具体被观察者:天气数据 class WeatherData : public Subject { private: std::vector observers; float temperature; float humidity;

public: void setMeasurements(float temp, float hum) { this->temperature = temp; this->humidity = hum; notify(); // 状态变化,通知所有观察者 }

void attach(Observer* o) override {
    observers.push_back(o);
}

void detach(Observer* o) override {
    observers.erase(std::remove(observers.begin(), observers.end(), o), observers.end());
}

void notify() override {
    for (Observer* observer : observers) {
        observer->update(temperature, humidity);
    }
}

};

// 具体观察者:显示设备 class CurrentDisplay : public Observer { public: void update(float temperature, float humidity) override { std::cout

使用方式

你可以这样使用上述代码:

Motiff妙多 Motiff妙多

Motiff妙多是一款AI驱动的界面设计工具,定位为“AI时代设计工具”

Motiff妙多 334 查看详情 Motiff妙多 int main() { WeatherData weatherData; CurrentDisplay display;
weatherData.attach(&display);

weatherData.setMeasurements(25.5f, 60.0f);  // 输出:Current conditions: 25.5°C and 60% humidity
weatherData.setMeasurements(30.0f, 70.0f);  // 再次通知

return 0;

}

在这个例子中,WeatherData 是被观察者,维护多个观察者。一旦调用 setMeasurements 更新数据,就会触发 notify,所有注册的观察者都会收到最新数据并更新自己。

优化与注意事项

实际项目中可以考虑以下改进点:

  • 使用智能指针(如 std::shared_ptr)管理观察者生命周期,避免悬挂指针。
  • 用 std::list 或 std::set 替代 vector,提高删除效率。
  • 在多线程环境下,notify 需加锁保护观察者列表。
  • 可引入事件类型区分不同通知,让观察者选择性响应。

基本上就这些。观察者模式解耦了对象间的通信,适合用于事件处理系统、GUI组件、数据监听等场景。C++中通过虚函数和多态实现接口抽象,灵活又高效。

以上就是c++++ 怎么实现一个观察者模式_c++设计模式之观察者模式讲解的详细内容,更多请关注其它相关文章!


# 是一种  # 怎么推广代运营网站  # 轮滑培训推广营销文案简短  # 河南网站线上推广优化  # 焦作seo公司代理电话  # 郑州商城网站建设费用  # 公司推广网站推选火7星  # 肃宁环保网站建设材料  # 商丘网站优化推广哪里好  # 汝南百度推广招聘网站  # 石林县全网营销外包推广  # 在这个  # ai  # 就会  # 几个  # 边缘  # 是一个  # 加锁  # 多态  # 游戏开发  # 多线程  # red  # c++ 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: AO3网页版合集入口 Archive of Our Own同人作品浏览指南  Composer的 archive 命令怎么用_快速打包你的PHP项目及其Composer依赖  PHP URL参数传递与500错误调试指南  星露谷物语官网入口 星露谷物语游戏官网入口  想当下一个《2077》?《心之眼》Steam评价升至"多半好评"  《马克思佩恩3》早期版本曝光 UI设计曾多次调整!  1688商家版怎样分析买家画像精准供货_1688商家版分析买家画像精准供货【供货策略】  从J*aScript对象中精确提取指定属性的教程  高德地图总提示网络异常怎么办 高德地图离线导航设置与网络排查方法  steam官方入口大全 steam账号注册及操作指南  Lar*el DB::listen 事件中的查询执行时间单位解析  AO3官网镜像链接 Archive of Our Own同人文在线浏览  J*aScript中如何高效提取对象指定属性  UC浏览器如何安装插件 UC浏览器添加扩展程序详细教程【进阶】  如何使用纯J*aScript判断Input元素是否在特定类容器内  百度浏览器字体显示异常偏小_百度浏览器字体渲染修复方案  解决 Vaadin 8 中大文件音频播放与定位时出现的 IOException  腾讯视频怎么使用多账号家庭管理_腾讯视频家庭多账号统一管理与权限分配教程  J*aScript生成器_j*ascript异步迭代  在J*a中如何在J*a中使用异常机制记录错误日志_异常日志实践经验  yandex入口引擎手机版 yandex安卓版下载入口  word邮件合并后日期格式不对怎么改_Word邮件合并日期格式修改方法  漫蛙manwa2最新登录网址_漫蛙manwa2手机网页版入口  优酷会员付费后没到账怎么办_优酷会员充值异常及解决方法  J*aScript异步迭代器_j*ascript异步遍历  优化MinIO list_objects_v2 操作的性能瓶颈与最佳实践  LINUX怎么设置定时任务_LINUX crontab配置教程  知音漫客官网漫画下载_知音漫客网页版阅读记录  快手官方唯一登录入口 谨防山寨钓鱼网站  Python中高效且防溢出的双曲正弦计算:基于对数空间的优化策略  Surface怎么安装系统 微软Surface Pro U盘重装win11教程  J*a TimerTask中HashMap意外清空的深层原因与解决方案  J*a TimerTask文件监控:HashMap状态管理与常见陷阱规避指南  漫蛙MANWA漫画主页官方入口 漫蛙漫画最新在线阅读地址  Yandex免登录官网入口_俄罗斯Yandex搜索引擎直达链接  React/Next.js中实现列表项的动态选择与移动  Safari自带网页翻译功能怎么用 无需插件轻松看懂外文网站【方法】  uc浏览器网页版极速入口 uc网页浏览器网页版流畅体验  必由学官网首页入口 必由学教师网页版登录指南  J*aScript类型检查_j*ascript代码规范  LocoySpider如何部署到云服务器_LocoySpider云部署的远程配置  C++的std::forward_list怎么用_C++ STL中单向链表容器的特点与应用  Excel文件在线转换快速入口 Excel在线格式转换网站  c++如何使用TBB库进行任务并行_c++ Intel线程构建模块  CSS Flexbox如何实现多行排列_flex-wrap wrap自动换行显示  C++如何操作注册表_Windows平台下C++读写注册表的API函数详解  Win10怎么制作U盘启动盘 Win10系统安装U盘制作教程【详解】  微信网页版官方入口直达 微信网页版网页版登录使用方法  2026春节假期票务安排_2026春节放假购票指南  qq邮箱日历功能怎么用_创建日程与会议邀请的技巧 

搜索