观察者模式详解:原理、实现与应用场景
1. 什么是观察者模式观察者模式Observer Pattern是一种行为型设计模式用于在对象之间建立一对多的依赖关系。当一个对象称为主题或被观察者的状态发生变化时所有依赖它的对象称为观察者都会自动收到通知并更新自身状态。这种模式的核心思想是主题不直接调用观察者的方法而是通过发布通知的方式让观察者自行响应变化。这样主题和观察者之间就实现了松耦合双方可以独立扩展和复用。2. 模式结构观察者模式主要包含以下四个角色Subject主题维护观察者列表提供注册、注销和通知方法。ConcreteSubject具体主题实现主题接口状态变化时触发通知。Observer观察者定义接收通知的更新接口。ConcreteObserver具体观察者实现更新接口响应主题状态变化。3. 代码示例下面以 C/C 为例演示观察者模式的基本实现。#include iostream #include list #include string // 观察者接口 class Observer { public: virtual ~Observer() {} virtual void update(const std::string message) 0; }; // 主题接口 class Subject { public: virtual ~Subject() {} virtual void attach(Observer* observer) 0; virtual void detach(Observer* observer) 0; virtual void notifyObservers() 0; }; // 具体主题 class NewsPublisher : public Subject { private: std::listObserver* observers; std::string news; public: void attach(Observer* observer) override { observers.push_back(observer); } void detach(Observer* observer) override { observers.remove(observer); } void notifyObservers() override { for (Observer* observer : observers) { observer-update(news); } } void publishNews(const std::string news) { this-news news; notifyObservers(); } }; // 具体观察者 class EmailSubscriber : public Observer { private: std::string name; public: EmailSubscriber(const std::string name) : name(name) {} void update(const std::string message) override { std::cout name 收到新闻 message std::endl; } }; // 客户端测试 int main() { NewsPublisher publisher; EmailSubscriber alice(Alice); EmailSubscriber bob(Bob); publisher.attach(alice); publisher.attach(bob); publisher.publishNews(观察者模式发布了一条新消息); return 0; }4. 适用场景观察者模式在以下场景中非常实用事件监听系统如 GUI 按钮点击、鼠标移动等事件分发。消息推送如订阅号推送、邮件通知、App 消息提醒。数据同步多个视图需要同步显示同一份数据变化。分布式系统如消息队列中的发布-订阅模型。5. 优缺点分析优点主题和观察者之间松耦合便于独立扩展。支持广播通信一个主题可同时通知多个观察者。符合开闭原则新增观察者无需修改主题代码。缺点观察者过多时通知效率可能下降。观察者之间可能存在间接依赖导致调试困难。如果观察者更新逻辑复杂可能引发性能问题。6. 总结观察者模式通过发布-订阅机制让对象之间的依赖关系更加灵活和可维护。它在事件驱动架构、消息推送和数据同步等场景中应用广泛是日常开发中非常实用的设计模式之一。

相关新闻

微软校招研发工程师笔试考点拆解:从算法到系统设计

微软校招研发工程师笔试考点拆解:从算法到系统设计

如果你在2014年前后关注过微软校招,一定听说过那张被无数人拿来练手的《研发工程师笔试卷A》。我当时拿到卷子的第一反应是:题目量不大,但每道题都像在戳基本功的软肋。十几年过去,这张卷子里的具体题号我已经记不全,但…

2026/8/31 19:48:32 阅读更多 →
基于DCT的数字图像水印MATLAB实现与鲁棒性分析

基于DCT的数字图像水印MATLAB实现与鲁棒性分析

简介:本资源是一个面向数字图像处理初学者与课程设计者的MATLAB实践项目,聚焦DCT域数字水印的嵌入与提取原理实现,解决版权标识隐写、信息认证等典型应用场景中的基础算法验证问题。压缩包仅含2个核心文件(1个README.md说明文档 …

2026/8/31 19:48:32 阅读更多 →
Python+Commpy实现OFDM仿真系统:从链路搭建到误码率分析

Python+Commpy实现OFDM仿真系统:从链路搭建到误码率分析

简介:本资源是一套完整的基于Python的OFDM通信系统仿真项目,面向通信工程、电子信息类本科生及研究生,适用于毕业设计、课程设计与通信原理实践开发。项目依托Commpy开源通信算法库实现64子载波正交频分复用系统的端到端建模,涵盖…

2026/8/31 19:48:32 阅读更多 →

最新新闻

AI 我知道-06:为什么 AI 越聊越乱?上下文腐烂与论文协作工作流

AI 我知道-06:为什么 AI 越聊越乱?上下文腐烂与论文协作工作流

温馨提示:若页面不能正常显示数学公式和代码,请阅读原文获得更好的阅读体验。 作者: 丁闪闪 (连享会) 邮箱: lianxhcn163.com 系列说明:本文是「AI我知道」系列推文的第一篇,面向经管、金融、社会学领域的研…

2026/8/31 20:44:12 阅读更多 →
大数据毕业设计之基于机器学习的中文书目自动分类的设计与实现

大数据毕业设计之基于机器学习的中文书目自动分类的设计与实现

题目:基于机器学习的中文书目自动分类的设计与实现 一、项目介绍 随着信息技术的迅猛发展,图书管理与推荐系统日益成为研究与应用的重要领域。在中文图书市场,面对海量的书目数据,如何高效、准确地实现自动分类,成为提…

2026/8/31 20:44:12 阅读更多 →
InSAR相位解缠原理与MATLAB实现:从残差点到枝切法实战解析

InSAR相位解缠原理与MATLAB实现:从残差点到枝切法实战解析

简介:本资源是一套面向遥感与InSAR研究者的MATLAB相位解缠实践代码包,聚焦干涉SAR数据处理中的核心难点——2π周期性相位展开问题,适用于地表形变监测、地质灾害评估等科研与工程场景,尤其适合具备基础SAR知识和MATLAB编程能力的…

2026/8/31 20:44:12 阅读更多 →
MATLAB自动清除超声图像四周标注的完整流程与实现

MATLAB自动清除超声图像四周标注的完整流程与实现

简介:本资源是一套面向医学图像处理初学者与MATLAB开发者的超声图像预处理工具,聚焦解决临床超声图像中边缘手写标注、测量标记等干扰信息的自动清除问题,适用于超声影像AI分析、深度学习数据清洗及自动化诊断系统开发等场景。压缩包共7个文件…

2026/8/31 20:44:12 阅读更多 →
C#微信SDK封装实战:架构设计与核心实现解析

C#微信SDK封装实战:架构设计与核心实现解析

简介:这是一套面向 .NET 开发者的企业级微信生态集成解决方案,专为需要快速对接微信全平台能力的 C# 项目设计,覆盖公众平台(订阅号、服务号、小程序、小游戏、小商店)、开放平台、微信支付、企业微信、广点通广告平台…

2026/8/31 20:44:12 阅读更多 →
AI伪造论文冒名:学术身份风险的识别与防护指南

AI伪造论文冒名:学术身份风险的识别与防护指南

AI伪造论文冒名,已经不是停留在“有人用AI写作业”的阶段,而是变成了一种真实的学术身份风险:有人用AI生成论文,再把你的姓名、单位、研究方向、甚至照片拼上去,让论文看起来像你写的。学者遭遇AI伪造论文冒名&#xf…

2026/8/31 20:43:11 阅读更多 →

日新闻

MCU无DAC如何用定时器+DMA 2D输出高保真任意波形

MCU无DAC如何用定时器+DMA 2D输出高保真任意波形

接到一个仪表类项目,要在 LAT1189 上输出几种不同波形:正弦、三角、带可调死区的脉冲,频率和幅度都得能实时改。板子上没有 DAC,就一个定时器加几个 DMA 通道。我一开始觉得在定时器中断里改比较寄存器也能应付,后来把…

2026/8/31 0:00:05 阅读更多 →
Cortex-M3 Flash下载失败?从编程错误标志到供电瞬态排查

Cortex-M3 Flash下载失败?从编程错误标志到供电瞬态排查

前两周调试一块带着Cortex-M3内核的板子,IDE里下载固件时突然弹出一行刺眼的错误: error: flash download failed - cortex-m3 。这种报错在嵌入式开发里太常见了,常见到很多人第一反应就是换根数据线、重插一下调试器,但重启三…

2026/8/31 0:00:05 阅读更多 →
STM32 TouchGFX屏幕切换Transition优化:原理、配置与排障实战

STM32 TouchGFX屏幕切换Transition优化:原理、配置与排障实战

做STM32 GUI开发的朋友应该都有体会——界面搭得再漂亮,一旦屏幕切换卡成PPT,整个产品的档次瞬间就没了。早期我在LAT1212这个基于STM32的GUI工程上用TouchGFX做二次开发,最头疼的不是画界面,而是怎么让切换动画既流畅又自然。Tou…

2026/8/31 0:00:05 阅读更多 →

周新闻

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

每年校招季我都会接触不少准备数据库方向笔试的同学,看到最多的状态就是:简历上写着“熟悉 MySQL”“了解索引优化”,一碰到数据库管理工程师的笔试卷,却在索引、事务、锁、备份恢复这些题目上翻车。网易这套 2018 校园招聘数据库…

2026/8/31 13:13:27 阅读更多 →
数字电路时序基石:深入理解建立时间与保持时间

数字电路时序基石:深入理解建立时间与保持时间

1. 这不是“背公式”的事:时间参数到底在约束什么你翻过数字电路教材,一定见过这两个词:建立时间(Setup Time)和保持时间(Hold Time)。它们常被并列写在触发器(Flip-Flop&#xff09…

2026/8/31 9:02:46 阅读更多 →
蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

1. 项目缘起:从赛题到超声波测距机的诞生第八届蓝桥杯单片机设计与开发国赛的题目,我至今记忆犹新。它没有直接给出一个花哨的名字,而是用“超声波测距机”这个朴实无华的功能描述,精准地勾勒出了考核的核心。对于当时备赛的我而言…

2026/8/31 14:32:14 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/30 21:10:48 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/30 18:07:21 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/30 21:10:44 阅读更多 →