news 2026/2/24 10:09:03

C++ 观察者模式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++ 观察者模式

🎯 观察者模式协作关系说明

01、资源获取

>>>

通过网盘分享的文件:CXX观察者模式observer_pattern

链接: https://pan.baidu.com/s/15_ev6Y-ZL0cQjrfIrA7Y9Q?pwd=ubrb 提取码: ubrb

  1. 📖 模式概述

观察者模式(Observer Pattern)是一种行为设计模式,它定义了对象间的一对多依赖关系,当一个对象(被观察者)的状态发生变化时,所有依赖它的对象(观察者)都会自动收到通知并进行更新。

2. 🎭 核心角色

🎭 角色

📋 职责

💻 实现类

Subject(被观察者)

管理观察者列表,提供注册、移除和通知方法

Subject

Observer(观察者)

定义更新接口,用于接收被观察者的通知

Observer

ConcreteSubject(具体被观察者)

实现被观察者接口,维护具体状态

Subject

(本示例直接使用Subject作为具体被观察者)

ConcreteObserver(具体观察者)

实现观察者接口,处理被观察者的通知

ConcreteObserverA

ConcreteObserverB

3. 🗺️ 协作关系思维导图

4. 🔄 详细协作流程

4.1 🚀 初始化阶段

客户端创建被观察者对象

客户端创建多个观察者对象

客户端调用被观察者的attach()方法,将观察者注册到被观察者的观察者列表中

4.2 📢 通知阶段

客户端调用被观察者的setState()方法,修改被观察者的状态

setState()方法内部调用notify()方法,开始通知所有观察者

notify()方法遍历观察者列表,依次调用每个观察者的update()方法

每个观察者的update()方法被调用,执行各自的业务逻辑

4.3 ⚡ 动态调整阶段

客户端可以随时调用被观察者的detach()方法,将观察者从列表中移除

移除后的观察者将不再收到被观察者的通知

客户端也可以随时调用attach()方法,重新注册观察者

5. 💻 代码执行流程

以main.cpp为例,详细执行流程如下:

6. 🔗 关键方法调用链

6.1 ➕ 注册观察者

Client.attach(observer) → Subject.attach() → 观察者列表.push_back(observer)

6.2 📣 状态变化通知

Client.setState(state) → Subject.setState() → Subject.notify() → 遍历观察者列表 → 每个Observer.update(state)

6.3 ➖ 移除观察者

Client.detach(observer) → Subject.detach() → 观察者列表.remove(observer)

7. ✨ 设计优势

🔓 松耦合:被观察者和观察者之间通过接口通信,降低了耦合度

📈 可扩展性:可以轻松添加新的观察者类型,无需修改被观察者代码

⚡ 触发机制:实现了事件驱动的编程模型,状态变化自动触发更新

🎯 灵活性:可以动态添加和移除观察者

8. 🎪 应用场景

🖥️ 图形界面中的事件处理系统

📬 消息队列和发布-订阅系统

📊 数据监控和日志系统

⚙️ 配置文件更新通知

📈 股票价格实时更新

9. 🆚 与其他模式的区别

📊 模式

📝 主要区别

观察者模式

一对多关系,被观察者主动通知观察者

发布-订阅模式

引入中间层(消息队列),观察者被动订阅

中介者模式

多对多关系,通过中介者协调对象间通信

迭代器模式

用于遍历集合,不涉及事件通知

10. 🔧 代码优化建议

🔒 线程安全:当前实现不是线程安全的,在多线程环境下需要添加互斥锁保护观察者列表

🔄 避免循环依赖:注意避免观察者和被观察者之间的循环引用

⏱️ 异步通知:对于耗时的观察者更新,可以考虑使用异步通知机制

🎯 通知优先级:可以为观察者添加优先级,按照优先级顺序通知

📦 批量通知:对于频繁状态变化的场景,可以考虑批量通知,减少通知次数

11. 📝 总结

观察者模式是一种经典的设计模式,它实现了对象间的高效通信和状态同步。通过合理使用观察者模式,可以提高系统的可扩展性、松耦合性和可维护性。本示例展示了观察者模式的基本实现和使用方法,希望能帮助您理解和应用这一设计模式。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/23 16:06:56

GTE+SeqGPT企业应用案例:某IT公司内部技术知识库智能问答系统落地纪实

GTESeqGPT企业应用案例:某IT公司内部技术知识库智能问答系统落地纪实 1. 为什么这家IT公司决定自建知识库问答系统? 一家拥有300多名工程师的中型IT服务公司,过去三年里积累的技术文档已超过12万份——从服务器部署手册、API接口说明、故障…

作者头像 李华
网站建设 2026/2/24 3:39:02

DASD-4B-Thinking企业应用实战:vLLM服务化部署+Chainlit智能助手构建

DASD-4B-Thinking企业应用实战:vLLM服务化部署Chainlit智能助手构建 1. 为什么需要一个“会思考”的小模型? 你有没有遇到过这样的场景: 需要快速验证一段数学推导是否合理,但不想打开复杂IDE或等待大模型慢吞吞响应&#xff1…

作者头像 李华
网站建设 2026/2/22 21:47:36

Phi-4-mini-reasoning在ollama中效果展示:生成LaTeX公式+Markdown推理过程

Phi-4-mini-reasoning在Ollama中效果展示:生成LaTeX公式Markdown推理过程 1. 这个模型到底能干啥?先看几个真实例子 你有没有试过让AI写一段带推导步骤的数学证明?或者让它把一道微积分题从头到尾拆解清楚,每一步都配上说明&…

作者头像 李华
网站建设 2026/2/23 22:31:09

HY-MT1.5-1.8B自动驾驶场景:车载多语言交互系统集成

HY-MT1.5-1.8B自动驾驶场景:车载多语言交互系统集成 在智能汽车快速演进的今天,人车交互已不再满足于单一语音指令或固定语种响应。当用户用粤语询问导航路线、用维吾尔语查看车辆状态、用英语向后排乘客解释功能时,车载系统能否“听懂”“理…

作者头像 李华
网站建设 2026/2/21 7:27:47

打造个人AI助理:DeepSeek-R1本地部署详细步骤

打造个人AI助理:DeepSeek-R1本地部署详细步骤 1. 为什么你需要一个“能思考”的本地小模型? 你有没有过这样的体验: 想快速验证一个数学推导是否严谨,却不想打开网页搜答案; 写一段Python脚本卡在逻辑分支上&#xf…

作者头像 李华
网站建设 2026/2/23 5:59:52

【CSAPP 读书笔记】第二章:信息的表示和处理

1. 前言 深入理解计算机系统(简称CSAPP)作为计算机领域的一本经典之作,它不仅教会我们知识,更重要的是能改变我们看待程序和系统的方式。 第二章信息的表示和处理详细描述了计算机如何将所有类型的信息都转化为最基础的二进制进…

作者头像 李华