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

行为型模式 - 观察者模式 (Publish/Subscribe)

行为型模式 - 观察者模式 (Publish/Subscribe)

又称作为订阅发布模式(Publish-Subscribe Pattern)是一种消息传递模式,在该模式中,发送者(发布者)不会直接将消息发送给特定的接收者(订阅者),而是将消息发布到一个中间的消息代理(如主题或频道),订阅了该主题的订阅者可以接收到这些消息。以下是几个订阅发布模式的经典案例。


import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;// 主题接口
interface Subject {void registerObserver(Observer observer, String newsType);void removeObserver(Observer observer, String newsType);void notifyObservers(String newsType, String news);
}// 观察者接口
interface Observer {void update(String news);
}// 新闻机构类,实现主题接口
class NewsAgency implements Subject {private Map<String, List<Observer>> observers = new HashMap<>();@Overridepublic void registerObserver(Observer observer, String newsType) {observers.computeIfAbsent(newsType, k -> new ArrayList<>()).add(observer);}@Overridepublic void removeObserver(Observer observer, String newsType) {List<Observer> observerList = observers.get(newsType);if (observerList != null) {observerList.remove(observer);}}@Overridepublic void notifyObservers(String newsType, String news) {List<Observer> observerList = observers.get(newsType);if (observerList != null) {for (Observer observer : observerList) {observer.update(news);}}}public void publishNews(String newsType, String news) {System.out.println("发布 " + newsType + " 新闻: " + news);notifyObservers(newsType, news);}
}// 用户类,实现观察者接口
class User implements Observer {private String name;public User(String name) {this.name = name;}@Overridepublic void update(String news) {System.out.println(name + " 收到新闻: " + news);}
}// 客户端代码
public class NewsSystem {public static void main(String[] args) {NewsAgency newsAgency = new NewsAgency();User user1 = new User("张三");User user2 = new User("李四");// 用户订阅体育新闻newsAgency.registerObserver(user1, "体育");newsAgency.registerObserver(user2, "体育");// 用户订阅财经新闻newsAgency.registerObserver(user1, "财经");// 发布体育新闻newsAgency.publishNews("体育", "篮球比赛结果公布");// 发布财经新闻newsAgency.publishNews("财经", "股市行情上涨");}
}

相关文章:

行为型模式 - 观察者模式 (Publish/Subscribe)

行为型模式 - 观察者模式 (Publish/Subscribe) 又称作为订阅发布模式&#xff08;Publish-Subscribe Pattern&#xff09;是一种消息传递模式&#xff0c;在该模式中&#xff0c;发送者&#xff08;发布者&#xff09;不会直接将消息发送给特定的接收者&#xff08;订阅者&…...

C++编程指南21 - 线程detach后其注意变量的生命周期

一&#xff1a;概述 如果一个线程被 detach() 了&#xff0c;那么它的生命周期将独立于创建它的作用域。因此&#xff0c;该线程只能安全地访问&#xff1a; 全局变量&#xff08;global/static objects&#xff09;堆上分配的对象&#xff08;free-store allocated objects&a…...

Hadoop之01:HDFS分布式文件系统

HDFS分布式文件系统 1.目标 理解分布式思想学会使用HDFS的常用命令掌握如何使用java api操作HDFS能独立描述HDFS三大组件namenode、secondarynamenode、datanode的作用理解并独立描述HDFS读写流程HDFS如何解决大量小文件存储问题 2. HDFS 2.1 HDFS是什么 HDFS是Hadoop中的一…...

Redis学习笔记系列(一)——Redis简介及安装

1. Redis介绍 Redis是完全开源的&#xff0c;遵守 BSD 协议&#xff0c;是一个高性能的 key-value 数据库。 Redis与其他key-value缓存产品有以下三个特点&#xff1a; Redis支持数据的持久化&#xff0c;可以将内存中的数据保存在磁盘中&#xff0c;重启的时候可以再次加载进行…...

【考试大纲】初级信息处理技术员考试大纲

目录 引言一、考试说明1.考试要求2.考试目标二、考试范围科目一:信息处理基础知识科目二:信息处理应用技术引言 最新的信息处理技术员考试大纲出版于 2018 年 6 月,本考试大纲基于此版本整理。 一、考试说明 1.考试要求 (1)了解信息技术的基本概念; (2)熟悉计…...

LabVIEW正弦信号处理:FFT与最小二乘拟合的参数提取

问题一&#xff1a;LabVIEW能否对采集的正弦力信号进行快速傅里叶变换&#xff08;FFT&#xff09;&#xff0c;并得到幅值和相位结果&#xff1f; 答案&#xff1a; 可以。LabVIEW通过内置信号处理工具包提供完整的FFT分析功能&#xff0c;具体实现如下&#xff1a; FFT分析流…...

【计算机网络入门】初学计算机网络(五)

目录 1.编码&解码、调制&解调 2.常用编码方法 2.1 不归零编码&#xff08;NRZ&#xff09; 2.2 归零编码(RZ) 2.3 反向非归零编码(NRZI) 2.4 曼彻斯特编码 2.5 差分曼彻斯特编码 3. 各种编码的特点 4.调制 5.有线传输介质 5.1 双绞线 5.2 同轴电缆 5.3 光…...

YOLO在PiscTrace上检测到数据分析

在现代计算机视觉领域&#xff0c;实时视频数据的检测与分析对于安全监控、交通管理以及智能制造等领域具有重要意义。YOLO&#xff08;You Only Look Once&#xff09;作为一种高效的目标检测算法&#xff0c;能够在保持高精度的同时实现实时检测。而PiscTrace作为一款集成了O…...

【漫话机器学习系列】112.逻辑回归(Logistic Regression)

逻辑回归&#xff08;Logistic Regression&#xff09;详解 1. 逻辑回归简介 逻辑回归&#xff08;Logistic Regression&#xff09;是一种广泛用于二分类任务的统计和机器学习方法&#xff0c;尽管它的名字中带有“回归”&#xff0c;但它实际上是一种分类算法。 在逻辑回归…...

【计算机网络入门】初学计算机网络(六)

目录 1.回忆数据链路层作用 2. 组帧 2.1 四种组帧方法 2.1.1 字符计数法 2.1.2 字节填充法 2.1.3 零比特填充法 2.1.4 违规编码法 3. 差错控制 3.1 检错编码 3.1.1 奇偶校验码 3.1.2 CRC&#xff08;循环冗余校验&#xff09;校验码 3.2 纠错编码 3.2.1 海明校验码…...

DeepSeek 与云原生后端:AI 赋能现代应用架构

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 1. 引言 在当今快速发展的互联网时代&#xff0c;云原生&#xff08;Cloud Native&#xff09;架构已成为后端开发的主流趋势。云…...

leetcode第17题求电话号码组合

原题出于leetcode第17题https://leetcode.cn/problems/letter-combinations-of-a-phone-number/description/题目如下&#xff1a; 题目稍微有点复杂&#xff0c;初看会感觉特别复杂&#xff0c;首先我们需要理清思路&#xff1a; 最后的结果是字母组合&#xff0c;因此遍历的是…...

DeepSeek-R1 论文笔记:通过强化学习提升大语言模型的推理能力

论文标题&#xff1a;DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning 作者团队&#xff1a;DeepSeek-AI 发表时间&#xff1a;2025 前置知识 & 术语 模型蒸馏 语言模型蒸馏的目标是将大型教师模型的知识&#xff08;如语义理解、上…...

PDF文档中表格以及形状解析

我们在做PDF文档解析时有时需要解析PDF文档中的表格、形状等数据。跟解析文本类似的常见的解决方案也是两种。文档解析跟ocr技术处理。下面我们来看看使用文档解析的方案来做PDF文档中的表格、图形解析&#xff08;使用pdfium库&#xff09;。 表格解析&#xff1a; 在pdfium库…...

深入理解并实现自定义 unordered_map 和 unordered_set

亲爱的读者朋友们&#x1f603;&#xff0c;此文开启知识盛宴与思想碰撞&#x1f389;。 快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。 在 C 的标准模板库&#xff08;STL&#xff09;中&#xff0c;unorder…...

228页PPT丨制造业核心业务流程优化咨询全案(战略营销计划生产研发质量),附核心系统集成架构技术支撑体系,2月26日资料已更新

一、订单全生命周期管理优化 1. 智能订单承诺&#xff08;CTP&#xff09;系统 ●集成ERP/APS/MES数据&#xff0c;实时计算产能可视性 ●应用蒙特卡洛模拟评估订单交付风险 ●建立动态插单评估模型&#xff08;基于边际贡献与产能占用系数&#xff09; 2. 跨部门协同机制…...

6.6.5 SQL访问控制

文章目录 GRANT授予权限REVOKE回收权限 GRANT授予权限 GRANT语句可以给用户授予权限&#xff0c;基本格式是GRANT 权限 TO 用户。在授权时&#xff0c;WITH GRANT OPTION是可选项&#xff0c;有此句话&#xff0c;被授予权限的用户还能把权限赋给其他用户。 REVOKE回收权限 RE…...

PhyloSuite v1.2.3安装与使用-生信工具049

PhyloSuite 一个好用的win集成建树平台&#xff0c;官方相关文档视频等做的可好了PhyloSuite (jushengwu.com) 官网 https://github.com/dongzhang0725/PhyloSuite/releases #官网 http://phylosuite.jushengwu.com/dongzhang0725.github.io/installation/ #官方说明文档…...

【语法】C++中string类中的两个问题及解答

贴主在学习string类时遇到过两个困扰我的问题&#xff0c;今天拿出来给大家分享一下我是如何解决的 一、扩容时capacity的增长问题 在string的capacity()接口中&#xff0c;调用的是这个string对象的容量(可以存多少个有效字符)&#xff0c;而size()是调用的string对象现在有…...

智慧校园平台在学生学习与生活中的应用

随着科技的发展&#xff0c;教育领域也在不断探索新的模式与方法。智慧校园平台作为教育信息化的重要组成部分&#xff0c;正逐渐成为推动教育改革、提高教学质量的关键工具。 一.智慧校园平台概述 智慧校园平台是一种集成了教学管理、资源服务、数据分析等多功能于一体的数字…...

AtCoder Beginner Contest 001(A - 積雪深差、B - 視程の通報、C - 風力観測、D - 感雨時刻の整理)题解

由于我发现网上很少有人会发很久之前AtCoder Beginner Contes的题&#xff0c;所以我打算从AtCoder Beginner Contest 001开始写。大约两周一更&#xff0c;需要的可以订阅专栏&#xff0c;感谢支持Thanks♪(&#xff65;ω&#xff65;)&#xff89; →题目翻译 A - 積雪深差…...

Windows本地Docker+Open-WebUI部署DeepSeek

最近想在自己的电脑本地部署一下DeepSeek试试&#xff0c;由于不希望污染电脑的Windows环境&#xff0c;所以在wsl中安装了ollama&#xff0c;使用ollama拉取DeepSeek模型。然后在Windows中安装了Docker Desktop&#xff0c;在Docker中部署了Open-WebUI&#xff0c;最后再在Ope…...

gmock和cppfreemock原理学习

1.gmock用法 gmock&#xff08;Google Mock&#xff09;是 Google Test 的一个扩展库&#xff0c;专门用于 C 单元测试中的模拟&#xff08;mocking&#xff09;。它的核心原理是通过 继承和方法重载/覆盖 来模拟 C 中的虚函数&#xff0c;从而在测试中隔离依赖对象&#xff0…...

WSBDF レクチア 定义2 引理3 wsbdf的乘子

定义2 引理3 wsbdf的乘子 ここまで 寝みます❓...

AI日记app

一、需求分析与竞品调研 1. 核心功能需求 多媒体日记记录&#xff1a;支持语音、视频、图片的实时录制或上传。语音/视频转文字&#xff1a;自动将音频、视频内容转为可编辑的文字。文字编辑与排版&#xff1a;富文本编辑&#xff08;字体、颜色、标签&#xff09;、Markdown…...

单一职责原则(设计模式)

目录 问题&#xff1a; 定义&#xff1a; 解决&#xff1a; 方式 1&#xff1a;使用策略模式 示例&#xff1a;用户管理 方式 2&#xff1a;使用装饰者模式 示例&#xff1a;用户操作 方式 3&#xff1a;使用责任链模式 示例&#xff1a;用户操作链 总结 推荐 问题&a…...

Odoo免费开源CRM技术实战:从商机线索关联转化为售后工单的应用

文 / 开源智造 Odoo金牌服务 Odoo&#xff1a;功能强大且免费开源的CRM Odoo 引入了一种高效的客户支持管理方式&#xff0c;即将 CRM 线索转换为服务台工单。此功能确保销售和支持团队能够无缝协作&#xff0c;从而提升客户满意度并缩短问题解决时间。通过整合 CRM 模块与服…...

ChatGPT与DeepSeek:开源与闭源的AI模型之争

目录 一、模型架构与技术原理 二、性能能力与应用场景 三、用户体验与部署灵活性 四、成本与商业模式 五、未来展望与市场影响 六、总结 随着人工智能技术的飞速发展&#xff0c;ChatGPT和DeepSeek作为两大领先的AI语言模型&#xff0c;成为了行业内外关注的焦点。它们在…...

C语言(3)—循环、数组、函数的详解

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、函数二、循环与数组 1.循环2.数组 总结 前言 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、函数 在C语言中&#xff0c;函数…...

架构师论文《论面向对象设计的应用与实现》

软考论文-系统架构设计师 摘要 我所在的公司是国内一家专注于智慧城市建设的科技企业&#xff0c;为适应城市数字化转型中对于高内聚、低耦合、可扩展性的技术需求&#xff0c;2021年3月&#xff0c;公司立项开发“智慧社区综合管理平台”&#xff0c;旨在整合物业管理、安防监…...