观察者模式通过主题与观察者间的松耦合实现状态自动通知。1. 定义Observer接口含update方法;2. Subject维护observer列表并提供attach、detach、notify;3. 具体观察者如Display实现update;4. 使用时主题通知所有观察者,如天气站更新触发屏幕显示;5. 优化建议:用智能指针管理生命周期、线程安全加锁、避免循环引用。适用于GUI事件、日志监听等场景。
观察者模式(Observer Pattern)是一种行为型设计模式,用于定义对象之间的一对多依赖关系,当一个对象的状态发生变化时,所有依赖它的对象都会自动收到通知。在C++中实现观察者模式,通常涉及两个角色:主题(Subject)和观察者(Observer)。
要实现观察者模式,先定义抽象的Observer接口和Subject基类。
Observer接口规定了一个更新方法,所有具体观察者都需要实现它:
class Observer {
public:
virtual ~Observer() = default;
virtual void update(const std::string& message) = 0;
};
Subject类维护一个观察者列表,并提供添加、删除和通知的方法:
class Subject {
private:
std::vector observers;
public:
void attach(Observer* obs) {
observers.push_back(obs);
}
void detach(Observer* obs) {
observers.erase(
std::remove(observers.begin(), observers.end(), obs),
observers.end()
);
}
void notify(const std::string& message) {
for (auto* obs : observers) {
obs->update(message);
}
}};
假设我们有一个天气站作为主题,多个显示屏作为观察者。
定义具体观察者类:
class Display : public Observer { private: std::string name;
public: Display(const std::string& n) : name(n) {}
void update(const std::string& message) override { std::cout zuojiankuohaophpcnzuojiankuohaophpcn name zuojiankuohaophpcnzuojiankuohaophpcn " 显示: " zuojiankuohaophpcnzuojiankuohaophpcn message zuojiankuohaophpcnzuojiankuohaophpcn "\n"; }};
使用方式:
int main() {
Subject weatherStation;
Display screen1("室内屏");
Display screen2("室外屏");
weatherStation.attach(&screen1);
weatherStation.attach(&screen2);
weatherStation.notify("温度: 26°C");
weatherStation.detach(&screen1);
weatherStation.notify("温度: 28°C");
return 0;}
原始实现使用裸指针,存在悬挂引用风险。可以改用智能指针或信号槽机制提升安全性。
std::weak_ptr避免循环引用基本上就这些。C++中的观察者模式核心是松耦合通信,适合用在状态变化需要广播的场景,比如GUI事件系统、日志监听、模型-视图架构等。实现不复杂但容易忽略生命周期管理问题。
# c++
# ai
# 架构
# 循环
# 指针
# 接口
# 线程
# 对象
# 事件
# display
# 加锁
# 是一种
# 多个
# 适用于
# 用在
# 外屏
# 有一个
# 内屏
# 前应
# 规定了
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
网络优化76771 】
【
技术知识130152 】
【
IDC云计算60162 】
【
营销推广131313 】
【
AI优化88182 】
【
百度推广37138 】
【
网站推荐60173 】
【
精选阅读31334 】
相关推荐:
LINUX如何开放防火墙端口_Linux firewalld与iptables开放端口命令【安全配置】
php怎么下载安装并配置环境变量_命令行调用PHP技巧【技巧】
Win11如何设置自动关机 Win11定时关机命令使用教程【技巧】
Win11怎么设置系统还原_Windows11系统属性保护设置
如何使用Golang处理静态文件缓存_提高页面加载速度
Windows10如何更改鼠标图标_Win10鼠标属性指针浏览
Win10怎么设置开机密码_Windows10账户登录密码设置与取消
如何外贸网站设计-能留住客户提升用户体验!
Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】
Win11如何关闭游戏模式 Win11禁用Xbox Game Bar录制【优化】
php下载安装选zip还是msi格式_两种安装包对比【教程】
如何高效识别并拦截拼接式恶意域名 spam
MySQL 中使用 IF 和 CASE 实现查询字段条件化显示
Win11怎么查看硬盘型号_Windows 11检测硬盘信息方法【技巧】
Win11怎么设置默认邮件应用_Windows11应用关联Mail设置
Windows10蓝屏SYSTEM_SERVICE_EXCEPTION_Win10驱动冲突排查
Win11麦克风没声音怎么设置_Win11麦克风权限及驱动修复【教程】
Python字符串操作教程_切片拼接与格式化详解
Win11怎么设置默认终端应用_Windows11开发者选项终端
Win11讲述人怎么关闭_Win11误触开启语音朗读关闭【快捷键】
Python正则表达式实战_模式匹配说明【教程】
PythonGIL机制理解_多线程限制解析【教程】
Windows10系统怎么查看硬盘健康_Win10 SMART信息检测工具
Windows资源管理器总是卡顿或重启怎么办?(修复方法)
php怎么下载安装后测试是否成功_简单脚本验证方法【操作】
Windows10无法连接到Internet_Win10网络重置命令详解
Win11怎么查看显卡显存_查询Win11显卡详细参数方法【步骤】
如何使用Golang搭建Web开发环境_快速启动HTTP服务
Win11怎样安装钉钉客户端_Win11安装钉钉教程【步骤】
Windows10系统怎么查看已安装更新_Win10控制面板卸载补丁
如何在 Laravel 中通过嵌套关联关系进行 orderBy 排序
Python数据挖掘核心算法实践_聚类分类与特征工程
php嵌入式多设备通信怎么实现_php同时管理多个串口设备【操作】
Win11怎么设置单手模式_Win11触控键盘布局调整教程【技巧】
Win10如何卸载Skype_Win10卸载Skype步骤【步骤】
Win11怎么关闭触摸屏_禁用Win11笔记本触摸屏功能设置【教程】
Mac怎么设置鼠标滚动速度_Mac鼠标设置详细参数
为什么Go需要go mod文件_Go go mod文件作用说明
Windows10如何重置此电脑_Windows10电脑重置方法【步骤】
php下载安装后memory_limit怎么设置_内存限制调整【技巧】
Win11怎么设置开机密码_Windows11账户登录选项PIN码
C#如何序列化对象为XML XmlSerializer用法
c# 在高并发下使用反射发射(Reflection.Emit)的性能
Win11开机自检怎么关闭_跳过Win11开机磁盘扫描修复方法【技巧】
PythonPandas数据分析项目教程_时间序列透视表应用
Win11怎么关闭自动更新 Win11永久关闭系统更新的有效方法【技巧】
Win11如何连接Xbox手柄 Win11蓝牙连接游戏手柄教程【步骤】
php中常量能用::访问吗_类常量与作用域操作符使用场景【汇总】
mac本地php环境如何开启curl_curl扩展启用与测试步骤详解【汇总】
如何在 PHP 中按相同键合并两个关联数组为二维数组
2025-11-20
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。