C++怎么实现一个观察者设计模式_C++行为型模式与Observer Pattern


观察者模式通过主题与观察者间的松耦合实现状态自动通知。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避免循环引用
  • 观察者在析构前应主动从Subject解绑
  • 线程安全场景下需加锁保护观察者列表
  • 可引入事件类型区分不同通知

基本上就这些。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

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

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

点击免费数据支持

提交您的需求,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.