当前位置: 首页 > article >正文

每日一学:设计模式之观察者模式

观察者模式Observer Pattern属于行为型设计模式核心定义构建对象间一对多的依赖关系当被观察者发布者 / 主题状态发生变化时所有订阅它的观察者订阅者会自动收到通知并执行更新逻辑。别名也叫发布 - 订阅模式、监听者模式、Event Listener是日常开发最常用、最易理解的设计模式之一。常见的观察者模式应用消息队列、redis发布订阅、spring事件通知一、观察者模式能解决什么问题举例杂志订阅、公众号推送、商城降价提醒、天气预报推送你订阅公众号后博主发布新文章状态变更所有粉丝自动接收推送无需每个人主动刷新查看。如果不使用观察者模式硬编码耦合一个业务变更需要手动调用多个模块的方法扩展性极差新增业务分支必须修改原有核心代码维护混乱对象之间强依赖一处改动引发连锁 bug。观察者模式完美解决解耦核心业务与后续联动逻辑核心类只负责自身业务无需关心有多少下游依赖方。二、核心角色拆解抽象被观察者Subject维护观察者集合提供订阅、取消订阅、批量通知的抽象方法。具体被观察者Concrete Subject持有自身状态状态变更后触发通知方法推送消息给所有观察者。抽象观察者Observer统一更新接口定义update()方法接收被观察者的通知。具体观察者Concrete Observer实现更新接口自定义收到通知后的业务逻辑。客户端组装被观察者与观察者完成订阅绑定。三、手写 Java 完整实现1. 抽象观察者接口public interface Observer { // 接收通知、执行更新 void update(String message); }2. 抽象被观察者public abstract class Subject { // 维护观察者列表 protected ListObserver observerList new ArrayList(); // 订阅 public abstract void addObserver(Observer observer); // 取消订阅 public abstract void removeObserver(Observer observer); // 通知所有观察者 public abstract void notifyObservers(String message); }3. 具体被观察者消息发布方public class MessageSubject extends Subject { Override public void addObserver(Observer observer) { observerList.add(observer); } Override public void removeObserver(Observer observer) { observerList.remove(observer); } Override public void notifyObservers(String message) { // 遍历所有观察者推送消息 for (Observer observer : observerList) { observer.update(message); } } }4. 具体观察者多端接收方// 短信通知观察者 public class SmsObserver implements Observer { Override public void update(String message) { System.out.println(短信接收通知 message); } } // 邮件通知观察者 public class EmailObserver implements Observer { Override public void update(String message) { System.out.println(邮件接收通知 message); } } // 站内信观察者 public class WebObserver implements Observer { Override public void update(String message) { System.out.println(站内信接收通知 message); } }5. 测试public class ObserverDemo { public static void main(String[] args) { // 1. 创建被观察者 MessageSubject subject new MessageSubject(); // 2. 创建多个观察者 Observer sms new SmsObserver(); Observer email new EmailObserver(); Observer web new WebObserver(); // 3. 绑定订阅关系 subject.addObserver(sms); subject.addObserver(email); subject.addObserver(web); // 4. 被观察者状态变更自动推送通知 System.out.println(商城活动更新); subject.notifyObservers(双十一活动正式开启全场五折); // 5. 取消单个订阅 subject.removeObserver(web); System.out.println(\n价格变更通知); subject.notifyObservers(爆款商品限时降价200元); } }运行结果商城活动更新 短信接收通知双十一活动正式开启全场五折 邮件接收通知双十一活动正式开启全场五折 站内信接收通知双十一活动正式开启全场五折 价格变更通知 短信接收通知爆款商品限时降价200元 邮件接收通知爆款商品限时降价200元四、JDK 原生观察者支持拓展Java 内置提供了观察者模式原生实现无需手动编写集合管理被观察者继承Observable观察者实现Observer接口注意JDK 原生实现已标记过时不推荐生产使用仅作学习参考。五、推模式 vs 拉模式推模式示例实现被观察者主动推送完整数据给观察者观察者直接使用耦合低、使用简单。拉模式被观察者只推送变更信号观察者主动拉取被观察者最新数据适合大数据、复杂场景。六、优缺点分析优点符合开闭原则新增观察者无需修改被观察者代码直接新增实现类即可。松耦合设计被观察者与观察者仅通过接口依赖互不干涉内部逻辑。动态订阅运行时可以灵活新增、取消订阅动态调整依赖关系。事件联动解耦一套状态变更自动触发多模块联动代码简洁优雅。缺点通知顺序不可控默认遍历列表顺序推送无法自定义优先级。性能损耗观察者数量过多时循环通知会产生耗时同步阻塞影响性能。循环依赖风险若观察者内部反向修改被观察者状态容易引发死循环。内存泄漏观察者未主动取消订阅会被被观察者强引用导致无法回收。

相关文章:

每日一学:设计模式之观察者模式

观察者模式(Observer Pattern)属于行为型设计模式,核心定义:构建对象间一对多的依赖关系,当被观察者(发布者 / 主题)状态发生变化时,所有订阅它的观察者(订阅者&#xff…...

【2026年网易雷火春招- 4月26日-第一题- 喵居】(题目+思路+JavaC++Python解析+在线测试)

题目内容 在《忘川风华录》的喵居中,为了帮助名士猫完成进化,使君需要炼化出高阶的九世灵。 喵居的供台上目前散落着 nnn 团微小的「猫灵元魂」,第 iii 团元魂的灵力值为 aia_i...

Bluetooth Classic中的速率区别

0 Preface/Foreword1PHY介绍1.1 与BLE的区别BLE有PHY 1M和2M的区别,但是在Bluetooth Classic中,没有这个概念。因为PHY 1M和2M是BLE的专有术语。虽然BLE和Bluetooth Classic都是使用2.4GHz,但是走的两套不同的技术路线。1.2 PHY速率分类Bluet…...

智能电话录音总结,工具高精准识别快速整理,复盘通话超省心省事

最近试了2026年新迭代的这批智能电话录音总结工具,高精准识别加快速整理是真的香,现在复盘通话完全不用再熬大夜来回拖进度条扒内容,省心到我恨不得早两年用上。我做To B销售快三年,之前最头疼的就是每天打七八通客户电话&#xf…...

高效编程实践:用Codex告别重复造轮子

技术文章大纲:告别重复造轮子——Codex写脚本的高效实践核心概念与背景重复造轮子的定义:开发中重复实现已有功能的现象及其效率问题Codex的定位:AI辅助编程工具如何通过自然语言生成代码适用场景:快速原型开发、自动化脚本、代码…...

ChatGPT-CLI:终端集成AI助手,提升开发者效率的实战指南

1. 项目概述:一个让ChatGPT在终端里“安家”的命令行工具如果你和我一样,每天大部分时间都泡在终端(Terminal)里,那么你一定有过这样的体验:为了向ChatGPT提个问题,或者让它帮忙写段代码&#x…...

如何搭建逻辑备库_SQL Apply与不支持的数据类型评估

SQL Apply 启动失败主因是备库控制文件残留主库“只读”标记或角色未正确设为PHYSICAL STANDBY;需确保V$DATABASE中DATABASE_ROLEPHYSICAL STANDBY且OPEN_MODEMOUNTED,并清理V$DATAGUARD_CONFIG中重复DB_UNIQUE_NAME。SQL Apply 启动失败报 ORA-16000 或…...

华为HDC大会2024张平安总keynote盘古多模态生成大模型:STCG技术如何重塑自动驾驶数据引擎

从"娱乐生成"到"产业生成":盘古的差异化路径 当业界多模态大模型还在追逐一镜到底的娱乐视频生成时,盘古5.0选择了一条截然不同的技术路线——聚焦行业急需的价值场景。在华为HDC大会上,盘古团队首次系统披露了多模态生…...

GEEKOM GT1 Mega迷你主机Ubuntu 24.10性能评测

1. GEEKOM GT1 Mega迷你主机深度评测:Ubuntu 24.10下的Intel Core Ultra 9 185H体验 作为一名长期关注迷你主机的技术爱好者,最近我有机会对搭载Intel Core Ultra 9 185H处理器的GEEKOM GT1 Mega进行了全面测试。这款迷你主机在Windows 11 Pro环境下表现…...

Transformer和LLM前沿内容(4):Long-Context LLM

文章目录1. Context Extension1.1 Rotary Position Embedding (RoPE)1.2 LongLoRA2. Evaluation of Long-Context LLMs2.1 The Lost in the Middle Phenomenon2.2 Long-Context Benchmarks: NIAH, LongBench3. Efficient Attention Mechanisms3.1 KV Cache3.2 StreamingLLM and…...

YLB3118 × DeepSeek V4@ACP#国产存储控制芯片,筑牢大模型推理的 “数据基石”

在国产 AI 大模型加速落地的浪潮中,DeepSeek V4 凭借万亿级参数、百万级上下文窗口的硬核实力,成为开源大模型的标杆;而YLB3118 作为国产 PCIe 转 SATA 存储控制芯片的核心代表,以高密度扩展、低功耗、工业级可靠的特性&#xff0…...

VMware+RockyLinux10

VMwareRocky Linux 10 1、官网下载 2、安装 3、配置VMware部分 下载 VMware官方网站:https://www.vmware.com 目前只做宣传,无下载入口 可以下载到的官网:https://support.broadcom.com/group/ecx/free-downloads 右上角Login用Broadcom Supp…...

PE-bear深度解析:跨平台PE文件分析的瑞士军刀

PE-bear深度解析:跨平台PE文件分析的瑞士军刀 【免费下载链接】pe-bear Portable Executable reversing tool with a friendly GUI 项目地址: https://gitcode.com/gh_mirrors/pe/pe-bear 在逆向工程和恶意软件分析领域,PE文件分析工具是安全研究…...

齐纳二极管稳压原理与工程应用全解析

1. 齐纳二极管稳压原理深度解析 齐纳二极管(Zener Diode)作为电子电路中最经典的电压基准元件,其核心工作原理建立在PN结的反向击穿特性上。当反向电压达到特定阈值(VZ)时,二极管进入击穿区,此时…...

MusicPlayer2完全指南:10个技巧让你的Windows音乐体验焕然一新

MusicPlayer2完全指南:10个技巧让你的Windows音乐体验焕然一新 【免费下载链接】MusicPlayer2 MusicPlayer2是一款功能强大的本地音乐播放软件,旨在为用户提供最佳的本地音乐播放体验。它支持歌词显示、歌词卡拉OK样式显示、歌词在线下载、歌词编辑、歌曲…...

SVM与拉格朗日乘子法:从原理到Python实现

1. 从理论到实践:理解SVM与拉格朗日乘子法的本质支持向量机(SVM)作为机器学习领域的经典算法,其核心思想来源于统计学习理论和凸优化方法。我在实际项目中多次使用SVM解决分类问题,发现真正理解其背后的数学原理&#…...

Mysql的源码编译

1.下载安装包wget https://downloads.mysql.com/archives/get/p/23/file/mysql-boost-8.3.0.tar.gz2.源码编译​ [rootmysql-node1 ~]# dnf install cmake3 gcc git bison openssl-devel ncurses-devel systemd-devel rpcgen.x86_64 libtirpc-devel-1.3.3-9.el9.x86_64.rpm gc…...

5个小众机器学习可视化工具提升模型解释力

1. 机器学习可视化工具的隐藏瑰宝在数据科学项目中,可视化从来不只是锦上添花——它直接决定了你的模型能否被非技术背景的决策者理解。虽然Matplotlib和Seaborn已经人尽皆知,但今天我要分享的这五个小众可视化库,能让你的机器学习故事讲述能…...

谷歌SEO如何做图标优化?

在谷歌搜索算法持续演进与用户体验标准不断提升的当下,网站技术SEO的精细化程度已成为影响排名与流量的关键因素。其中,图标(Icons)作为用户界面与品牌视觉识别的重要元素,其优化处理往往被忽视,却对网站性…...

利用Obsidian Local REST API构建可检索的AI对话知识库

1. 项目概述:在 Obsidian 中构建你的 AI 对话知识库如果你和我一样,日常重度依赖 Cursor 的 AI 编程助手来探讨技术方案、解决代码问题,那么一个痛点很快就会浮现:那些充满洞见的对话,在 Cursor 的聊天历史里翻找起来异…...

从‘酷女孩’到‘商务女性’:用Stable Diffusion + Lora 玩转AI人像风格化的实战心得

从‘酷女孩’到‘商务女性’:Stable Diffusion Lora 风格化人像生成实战指南 在数字艺术创作领域,AI生成技术正以前所未有的速度重塑着内容生产方式。作为一名长期深耕AI视觉创作的实践者,我深刻体会到Stable Diffusion配合Lora模型带来的创…...

MacBook Pro用户必看:M4芯片的38 TOPS Neural Engine,真能让Stable Diffusion本地跑得更快吗?

M4芯片加持下的MacBook Pro:Stable Diffusion本地运行实战指南 当苹果在春季发布会上骄傲地宣布M4芯片的Neural Engine达到38 TOPS算力时,整个创意社区都在问同一个问题:这能让我的MacBook真正流畅运行Stable Diffusion吗?作为每天…...

机器学习工程师职业指南:从入门到高薪就业

1. 为什么现在进入机器学习领域正当时? 十年前我第一次接触机器学习时,整个领域还停留在学术论文和实验室阶段。如今超市的智能结算系统、手机里的人脸解锁、邮箱里的垃圾邮件过滤,背后都是机器学习在发挥作用。这个转变不仅意味着技术成熟度…...

概率分布实战指南:从基础到应用

1. 概率分布入门指南概率分布就像天气预报中的降水概率图——它能告诉我们不同结果出现的可能性大小。作为数据分析、机器学习和统计建模的基础工具,理解概率分布相当于掌握了量化不确定性的语言。我在金融风控和AB测试领域工作十年,每天都要和各种分布打…...

AWS CDK构造库实战:快速构建生成式AI应用基础设施

1. 项目概述:当CDK遇上生成式AI 如果你正在用AWS构建生成式AI应用,并且已经厌倦了在控制台里手动点击、配置各种服务,或者在CloudFormation模板里反复调试那些复杂的IAM权限和网络配置,那么 awslabs/generative-ai-cdk-construc…...

开源规则引擎Ruler:解耦复杂业务逻辑的声明式编程实践

1. 项目概述与核心价值最近在折腾一些文档处理和自动化流程,发现一个挺有意思的开源项目,叫intellectronica/ruler。乍一看名字,你可能会联想到“尺子”或者“规则”,没错,它的核心功能就是帮你定义和执行一系列规则&a…...

天赐范式第23天:上篇是过程,这篇是结果,基于算子化筛选的MOF催化剂高通量发现系统

🚀 摘要感觉和前文很像是吧!是就对了,上篇是过程,这篇是结果。材料筛选是材料科学研究的核心瓶颈。传统的试错法和单一DFT计算效率低下,难以应对海量材料空间的探索需求。本文提出天赐范式 v5.16,一种基于四…...

模拟IC设计效率翻倍:用Cadence Virtuoso OCEAN脚本批量生成gmid、ft、本征增益曲线

模拟IC设计效率革命:基于OCEAN脚本的晶体管特性自动化分析实战 在模拟集成电路设计中,晶体管的gm/id曲线分析是评估器件性能的核心方法之一。传统的手动仿真流程需要反复点击ADE界面、逐个添加表达式、多次调整绘图参数,不仅耗时费力&#xf…...

利用MCP协议与OpenAPI规范,让AI编程助手实时理解项目API

1. 项目概述:当IDE里的AI助手“读懂”你的API文档如果你和我一样,每天的工作都离不开和各种API打交道,那你肯定也经历过这样的场景:为了调用一个接口,得在IDE和Swagger UI、Postman或者API文档网站之间来回切换&#x…...

【RT-DETR涨点改进】ICCV 2025 | 独家创新首发、注意力改进篇| 引入CBSM通道增强与智能空间映射模块,抑制背景噪声、强化关键目标,含7种创新改进,助力小目标检测、遥感目标检测高效涨点

一、本文介绍 🔥本文给大家介绍使用 CBSM通道增强与智能空间映射模块 改进RT-DETR网络模型,作用在于对输入特征进行通道增强与空间映射,使浅层图像信息能够更好地适配深层语义特征,从而提升特征表达质量并减少特征不匹配问题。其优势体现在能够有效抑制背景噪声、强化关键…...