观察者模式通过抽象基类定义更新接口,被观察者维护观察者列表并通知其状态变化。使用指针管理依赖关系时需注意生命周期,避免悬空指针,推荐结合智能指针提升安全性。
观察者模式是一种行为设计模式,用于在对象之间定义一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都会自动收到通知。在C++中,可以通过抽象基类和指针或引用管理观察者来实现这一模式。
观察者角色通常由一个抽象基类表示,其中包含一个更新函数,所有具体观察者都需要实现该函数。
class Observer {
public:
virtual ~Observer() = default;
virtual void update() = 0;
};被观察者负责维护观察者列表,并在状态变化时通知它们。
#include#include 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() { for (auto* obs : observers) { obs->update(); } } };
具体观察者实现自己的响应逻辑,比如打印信息或更新自身状态。
class ConcreteObserver : public Observer {
private:
int observerId;
public:
ConcreteObserver(int id) : observerId(id) {}
void update() override {
std::cout << "Observer " << observerId << " received update!\n";
}
};将上述部分组合,演示如何注册多个观察者并触发通知。
#includeint main() { Subject subject; ConcreteObserver obs1(1); ConcreteObserver obs2(2); subject.attach(&obs1); subject.attach(&obs2); subject.notify(); // 输出两条消息 subject.detach(&obs1); subject.notify(); // 只有 obs2 收到通知 return 0; }
基本上就这些。通过抽象接口和动态绑定,C++能很好地支持观察者模式。关键是管理好生命周期,避免野指针。如果需要更安全的管理,可以用 std::weak_ptr 配合 std::shared_ptr 实现自动清理。
# go
# ai
# c++
# ios
# stream
# red
# 指针
# 继承
# 虚函数
# 纯虚函数
# 接口
# 空指针
# 对象
# 自己的
# 这一
# 很好
# 是一种
# 多个
# 可以用
# 只需
# 并在
# 可以通过
# 两条
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
网络优化76771 】
【
技术知识130152 】
【
IDC云计算60162 】
【
营销推广131313 】
【
AI优化88182 】
【
百度推广37138 】
【
网站推荐60173 】
【
精选阅读31334 】
相关推荐:
Win11屏幕亮度突然变暗怎么解决_自动变暗问题处理
Win10如何更改开机密码_Windows10登录选项更改密码
Mac的“调度中心”与“空间”怎么用_Mac多桌面高效管理【技巧】
如何使用Golang reflect检查方法数量_动态分析类型方法
Win11 C盘满了怎么清理 Win11磁盘清理和存储感知使用教程【新手必看】
如何使用Golang实现文件追加操作_向已有文件追加数据
Windows怎样关闭锁屏广告_Windows关闭锁屏广告方法【教程】
Python字符串操作教程_切片拼接与格式化详解
Python数据挖掘进阶教程_分类回归与聚类案例解析
Windows 11如何开启文件夹加密(EFS)_Windows 11文件属性中加密内容以保护数据
如何在JavaScript中动态拼接PHP的base_url与jQuery变量
C#怎么创建控制台应用 C# Console App项目创建方法
Win11任务栏颜色怎么改_Win11自定义任务栏配色设置【美化】
php订单日志怎么导出excel_php导出订单日志到表格教程【教程】
Windows10怎样设置家长控制_Windows10家长控制设置方法【指南】
php错误怎么开启_display_errors与log_errors的设置【汇总】
GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?
c++中的CRTP是什么 c++奇异递归模板模式【进阶】
Win11怎么关闭应用权限_Windows11相机麦克风隐私管理
php485返回数据不完整怎么办_php485数据分包重组处理方法【教程】
mac怎么退出id_MAC退出iCloud账号与Apple ID切换【指南】
Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】
c++ std::atomic如何保证原子性 c++ CAS操作原理【底层】
如何提升Golang程序I/O性能_Golang I/O密集型程序优化示例
Windows10系统服务优化指南_Win10禁用不必要服务提升性能
Windows10如何重置此电脑_Windows10电脑重置方法【步骤】
PythonGIL机制理解_多线程限制解析【教程】
如何使用Golang实现微服务事件驱动_使用消息总线解耦服务
Windows10如何更改计算机工作组_Win10系统属性修改Workgroup
Win11任务栏天气怎么关闭 Win11隐藏天气小组件图标【设置】
php转mp4怎么设置帧率_调整php生成mp4视频帧率说明【说明】
Golang如何遍历目录文件_Golang filepath.Walk目录遍历操作方法
Win11怎么关闭边缘滑动手势_Windows11禁用触摸屏边缘操作
Windows蓝屏错误0x0000002C怎么解决_系统IO异常排查方法
Win11怎么关闭右下角弹窗_Win11拦截系统通知广告【设置】
Win11怎么查看显卡显存_查询Win11显卡详细参数方法【步骤】
Python如何创建带属性的XML节点
Win11怎么连接投影仪_Win11多显示器投屏设置指南【步骤】
如何在Golang中使用encoding/gob序列化对象_存储和传输数据
如何在 Go 中高效缓存与分发网络视频流
如何在Golang中处理二进制数据_Golang io与encoding/binary二进制操作方法
如何在同包不同文件中正确引用 Go 结构体
Win11怎么更改文件夹图标_自定义Win11文件夹外观样式【详解】
MAC如何隐藏文件夹及文件_MAC终端命令隐藏与第三方工具加密【教程】
Windows10系统怎么查看设备管理器_Win10快捷键Win+X菜单使用
php查询数据怎么分组_groupby分组查询配合聚合函数【技巧】
Win11怎么开启自动HDR画质_Windows11显示设置HDR选项
如何在Golang中实现并发消息队列消费者_Golang channel消息消费实践
如何在Golang中定义接口_抽象方法和多态实现
Win10电脑怎么设置IP地址_Windows10网络属性固定IP配置
2025-12-13
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。