观察者模式通过定义一对多依赖关系,实现对象间松耦合通信。Subject维护Observer列表,状态变化时调用notify通知所有观察者;Observer接口定义update方法,具体观察者如CurrentDisplay实现更新逻辑。示例中WeatherData作为具体被观察者,在setMeasurements后触发notify,向所有注册的观察者广播温度和湿度数据。使用vector存储观察者指针,attach和detach用于动态管理订阅关系。main函数演示了注册观察者并更新数据的过程,输出当前天气条件。实际应用中建议使用智能指针管理生命周期,选用list或set提升删除效率,多线程下对观察者列表加锁保护,并可扩展事件类型支持选择性监听。该模式适用于事件系统、GUI交互和数据监控等场景,利用虚函数与多态机制在C++中高效实现回调通知。
观察者模式是一种行为设计模式,用于在对象之间定义一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都会自动收到通知。在C++中实现观察者模式,通常涉及两个角色:被观察者(Subject)和观察者(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
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
你可以这样使用上述代码:
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,所有注册的观察者都会收到最新数据并更新自己。
实际项目中可以考虑以下改进点:
基本上就这些。观察者模式解耦了对象间的通信,适合用于事件处理系统、GUI组件、数据监听等场景。C++中通过虚函数和多态实现接口抽象,灵活又高效。
# ai
# c++
# red
# Float
# 多态
# int
# void
# 指针
# 虚函数
# 接口
# class
# public
# private
# 线程
# 多线程
# 对象
# 事件
# default
# this
# display
# 加锁
# 是一个
# 几个
# 就会
# 是一种
# 在这个
# 你可以
# 抽象类
相关文章:
如何彻底删除建站之星生成的Banner?
javascript中对象的定义、使用以及对象和原型链操作小结
c# F# 的 MailboxProcessor 和 C# 的 Actor 模型
如何通过虚拟主机空间快速建站?
交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?
东莞专业制作网站的公司,东莞大学生网的网址是什么?
图册素材网站设计制作软件,图册的导出方式有几种?
如何在阿里云通过域名搭建网站?
香港服务器如何优化才能显著提升网站加载速度?
如何通过商城自助建站源码实现零基础高效建站?
微网站制作教程,我微信里的网站怎么才能复制到浏览器里?
建站之星伪静态规则如何设置?
网站制作员失业,怎样查看自己网站的注册者?
建站之星如何防范黑客攻击与数据泄露?
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
北京网站制作网页,网站升级改版需要多久?
Thinkphp 中 distinct 的用法解析
建站之星免费版是否永久可用?
如何通过虚拟主机快速搭建个人网站?
如何通过VPS建站无需域名直接访问?
,有什么在线背英语单词效率比较高的网站?
如何在Golang中处理模块冲突_解决依赖版本不兼容问题
手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?
外贸公司网站制作哪家好,maersk船公司官网?
济南企业网站制作公司,济南社保单位网上缴费步骤?
如何通过可视化优化提升建站效果?
广州顶尖建站服务:企业官网建设与SEO优化一体化方案
建站之星展会模版如何一键下载生成?
如何构建满足综合性能需求的优质建站方案?
如何在景安服务器上快速搭建个人网站?
建站之星安装后如何配置SEO及设计样式?
定制建站哪家更专业可靠?推荐榜单揭晓
建站之星后台密码遗忘?如何快速找回?
东莞专业网站制作公司有哪些,东莞招聘网站哪个好?
SQL查询语句优化的实用方法总结
如何通过宝塔面板实现本地网站访问?
如何在宝塔面板中修改默认建站目录?
建站之星安装模板失败:服务器环境不兼容?
建站主机CVM配置优化、SEO策略与性能提升指南
如何通过虚拟机搭建网站?详细步骤解析
北京制作网站的公司,北京铁路集团官方网站?
孙琪峥织梦建站教程如何优化数据库安全?
如何通过商城免费建站系统源码自定义网站主题?
电脑免费海报制作网站推荐,招聘海报哪个网站多?
教育培训网站制作流程,请问edu教育网站的域名怎么申请?
如何在腾讯云服务器上快速搭建个人网站?
招贴海报怎么做,什么是海报招贴?
如何在阿里云ECS服务器部署织梦CMS网站?
如何在云虚拟主机上快速搭建个人网站?
如何生成腾讯云建站专用兑换码?
*请认真填写需求信息,我们会在24小时内与您取得联系。