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

行为设计模式 -观察者模式- JAVA

观察者模式

    • 一.简介
    • 二. 案例
      • 2.1 抽象主题(Subject)
      • 2.2 具体主题(Concrete Subject)
      • 2.3 抽象观察者(Observer)
      • 2.4 具体观察者(Concrete Observer)
      • 2.5 测试
    • 三. 结论
      • 3.1 优缺点
      • 3.2 使用场景

前言

这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。

作者:神的孩子都在歌唱

一.简介

百度百科: 观察者模式是一种对象行为模式。又被称为发布-订阅(Publish/Subscribe)模式, 它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。在观察者模式中,主体是通知的发布者,它发出通知时并不需要知道谁是它的观察者,可以有任意数目的观察者订阅并接收通知。观察者模式不仅被广泛应用于软件界面元素之间的交互,在业务对象之间的交互、权限管理等方面也有广泛的应用。

个人理解: 这个模式在日常开发中很常见,比如a服务想要b服务磁盘满的时候通知它,那么它只需要把自己的grpc或者http接口给到b服务,b服务订阅后,如果磁盘满了就调用a服务注册的接口 通知。

在观察者模式中有如下角色:

  • 抽象主题(Subject) 它把所有观察者对象的引用保存到一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。
  • 具体主题(Concrete Subject): 将有关状态存入具体观察者对象;在具体主题内部状态改变时,给所有登记过的观察者发出通知。
  • 抽象观察者(Observer): 为所有的具体观察者定义一个接口,在得到主题通知时更新自己。
  • 具体观察者(Concrete Observer): 实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题状态协调。

二. 案例

我将实现一个简单的主题(Subject)观察者(Observer)可以注册到该主题。每当有新消息发布到主题时,所有注册观察者都会收到通知,并且他们可以使用该消息。

请添加图片描述

这里是基本Subject接口,它定义了任何具体主题要实现的接口方法。

2.1 抽象主题(Subject)

/*** @author chenyunzhi* @date 2024/6/5 17:13* @Description 主题*/
public interface Subject {/*** 注册观察者*/void register(Observer observer);/*** 取消观察者*/void unregister(Observer observer);/*** 通知观察者消息有更新*/void notifyObservers();}

2.2 具体主题(Concrete Subject)

/*** @author chenyunzhi* @date 2024/6/5 17:21* @Description 实现主题*/
public class SubjectImpl implements Subject{/*** 同步锁*/private final Object SUB= new Object();/*** 存储注册的观察者*/private final List<Observer> observers = new ArrayList<>();/*** 要通知的消息*/private String message;/*** 防止 notifyObservers方法被外部调用发送错误通知*/private boolean flag;@Overridepublic void register(Observer observer) {if (observer != null) {synchronized (SUB) {// 如果不在就存储if (!observers.contains(observer)) {observers.add(observer);}}}}@Overridepublic void unregister(Observer observer) {if (observer != null) {synchronized (SUB) {observers.remove(observer);}}}@Overridepublic void notifyObservers() {List<Observer> objects = new ArrayList<>();//使用同步方法确保通知仅发送给新消息前注册的观察者synchronized (SUB) {if (!flag) {return;}objects = this.observers;this.flag = false;}for (Observer observer:objects) {// 通知观察者,有消息更新observer.update(this.message);}}/*** 自定义一个消息变更方法方便测试*/public void updateMessage(String message) {System.out.println("消息有变更,通知注册的观察者");this.message = message;this.flag = true;// 通知notifyObservers();}
}

2.3 抽象观察者(Observer)

/*** @author chenyunzhi* @date 2024/6/5 17:14* @Description 观察者类*/
public interface Observer {/*** 定义要更新的方法,由主题调用*/void update(String msg);
}

2.4 具体观察者(Concrete Observer)

/*** @author chenyunzhi* @date 2024/6/5 17:59* @Description 观察者实现类*/
public class ObserverImpl implements Observer{/*** 观察者名称*/private final String observerName;public ObserverImpl(String name) {this.observerName = name;}@Overridepublic void update(String msg) {System.out.println(observerName + "接收到消息:" + msg);}
}

2.5 测试

/*** @author chenyunzhi* @date 2024/6/6 14:57* @Description 观察者模式测试*/
public class ObserverPatternTest {public static void main(String[] args) {// 创建观察者并注册到主题SubjectImpl subject = new SubjectImpl();subject.register(new ObserverImpl("观察者1"));subject.register(new ObserverImpl("观察者2"));subject.register(new ObserverImpl("观察者3"));// 测试 更新消息subject.updateMessage("订阅的主题有消息更新了");}
}

请添加图片描述

三. 结论

3.1 优缺点

1.优点:

  • 降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系。
  • 被观察者发送通知,所有注册的观察者都会收到信息【可以实现广播机制】

2.缺点:

  • 如果观察者非常多的话,那么所有的观察者收到被观察者发送的通知会耗时
  • 如果被观察者有循环依赖的话,那么被观察者发送通知会使观察者循环调用,会导致系统崩溃

3.2 使用场景

  • 对象间存在一对多关系,一个对象的状态发生改变会影响其他对象。
  • 当一个抽象模型有两个方面,其中一个方面依赖于另一方面时。

作者:神的孩子都在歌唱

本人博客:https://blog.csdn.net/weixin_46654114

转载说明:务必注明来源,附带本人博客连接。

相关文章:

行为设计模式 -观察者模式- JAVA

观察者模式 一.简介二. 案例2.1 抽象主题&#xff08;Subject&#xff09;2.2 具体主题&#xff08;Concrete Subject&#xff09;2.3 抽象观察者&#xff08;Observer&#xff09;2.4 具体观察者&#xff08;Concrete Observer&#xff09;2.5 测试 三. 结论3.1 优缺点3.2 使用…...

在阿里工作是一种什么体验?

很多人都对在阿里工作感到好奇&#xff0c;今天就来给大家分享一下在阿里工作是一种什么体验~ 首先&#xff0c;先来介绍一下阿里的职位等级划分标准。 简单来讲&#xff0c;阿里的职位等级可以认为是 P 序列和 M 序列&#xff0c;但目前 M 序列已经不太对中下层员工开放了&…...

828华为云征文|华为云Flexus云服务器X实例——uniapp功能开发、搭建股票系统选择用什么服务器比较好?

在二次开发、安装搭建股票系统时&#xff0c;选择华为云Flexus X服务器是一个值得考虑的优质选项。以下是一些具体的建议&#xff1a; 测试环境&#xff1a;Linux系统CentOS7.6、宝塔、PHP7.3、MySQL5.7&#xff0c;根目录public&#xff0c;伪静态thinkphp&#xff0c;开启ssl…...

电子电路元件器介绍与选型——晶振

一、晶振 在我们使用嘉立创的时候&#xff0c;经常会看到晶振接到两个电容&#xff0c;这两个电容毫无疑问是滤波的&#xff0c;整个晶振其实就是一个振荡器&#xff0c;但这个振荡器会将其他频率给过滤掉&#xff0c;只保留一个频率也就是晶振的标称频率。当然上面讲的很明显是…...

【IEEE PDF eXpress】格式不对

目录 一、问题二、解决方法 一、问题 word的文档&#xff0c;用IEEE PDF eXpress网站生成pdf后&#xff0c;提交论文出现错误&#xff1a; Document validation failed due to the following errors: Content exceeds IEEE template margins for its format (Page 1:Bottom).…...

OpenAI全新多模态内容审核模型上线:基于 GPT-4o,可检测文本和图像

在数字时代&#xff0c;内容安全问题愈发受到重视。9月26日&#xff0c;OpenAI 正式推出了一款全新的多模态内容审核模型&#xff0c;名为 “omni-moderation-latest”。 该模型基于最新的 GPT-4o 技术&#xff0c;能够准确地识别检测有害文本图像。这一更新将为开发者提供强大…...

Visual Studio 字体与主题推荐

个人推荐&#xff0c;仅供参考&#xff1a; 主题&#xff1a;One Monokai VS Theme 链接&#xff1a;One Monokai VS Theme - Visual Studio Marketplacehttps://marketplace.visualstudio.com/items?itemNameazemoh.onemonokai 效果&#xff1a; 字体&#xff1a;JetBrain…...

信息学奥赛一本通 1416:【17NOIP普及组】棋盘 | 洛谷 P3956 [NOIP2017 普及组] 棋盘

【题目链接】 洛谷 P3956 [NOIP2017 普及组] 棋盘 ybt 1416&#xff1a;【17NOIP普及组】棋盘 【题目考点】 1. 深搜&#xff1a;深搜回溯 2. 深搜剪枝&#xff1a;最优化剪枝 【解题思路】 搜索从左上角到右下角的所有走法中花费金币最少的走法。 需要使用深搜回溯&…...

UE4完整教程 UE4简介 UE4学习攻略及文件格式

开头附上工作招聘面试必备问题噢~~包括综合面试题、无领导小组面试题资源文件免费!全文干货。 UE4简介学习攻略UE4Demo代码面试内容资源-CSDN文库https://download.csdn.net/download/m0_72216164/89825102 工作招聘无领导小组面试全攻略最常见面试题(第一部分)共有17章+可…...

JVM内存回收机制

目录 1.JVM运行时数据区 2.JVM类加载过程 3.双清委派模型 4.垃圾回收机制&#xff08;GC&#xff09; 找出谁是垃圾方案一&#xff1a;引用计数 找出谁是垃圾&#xff1a;方案二&#xff0c;可达性分析 释放垃圾的内存空间 判断垃圾&#xff1a;jvm依据对象的年龄对 对象…...

中国身份证号码校验

题目描述 第二届河南省最美教师评选开始了&#xff0c;每一位同学都可以投票选出你支持的人选&#xff0c;但是为了防止刷票&#xff0c;必须通过身份验证才可投票。负责投票平台后台的老大爷希望你能帮他验证身份证号的合法性&#xff0c;防止那些熊孩子随意刷票&#xff0c;…...

【Kubernetes】常见面试题汇总(五十四)

目录 120.创建 init C 容器后&#xff0c;其状态不正常&#xff1f; 特别说明&#xff1a; 题目 1-68 属于【Kubernetes】的常规概念题&#xff0c;即 “ 汇总&#xff08;一&#xff09;~&#xff08;二十二&#xff09;” 。 题目 69-113 属于【Kubernetes】的生产…...

不懂外语也能无障碍交流?探索4款超好用中英翻译工具

嘿&#xff0c;各位外贸流程的小伙伴们&#xff0c;今儿咱们来聊聊那些翻译神器&#xff0c;看看它们在中英文互译这条路上&#xff0c;是怎么给我们这些天天跟洋文打交道的哥们儿姐们儿减轻负担的。我亲身体验了福昕翻译在线、福昕翻译大师、海鲸AI翻译还有腾讯翻译君&#xf…...

C++ WebDriver扩展

概述 WebDriver协议基于HTTP&#xff0c;使用JSON进行数据传输&#xff0c;定义了client与driver之间的通信标准。无论client的实现语言&#xff08;如Java或C#&#xff09;&#xff0c;都能通过协议中的endpoints准确指示driver执行各种操作&#xff0c;覆盖了Selenium的所有功…...

WeChat_DevTools 断点调试方法总结

新建工程&#xff0c;以小程序 login 调试为例&#xff0c;代码如下&#xff1a; // 登录wx.login({success: res > {// 发送 res.code 到后台换取 openId, sessionKey, unionIddebugger;resThis this;wx.showModal({title: 登录成功,content: res.code res.code,comple…...

水波荡漾效果+渲染顺序+简单UI绘制

创建场景及布置 创建新场景Main,在Main场景中创建一个plane物体&#xff0c;命名为WaterWavePla,具体数值及层级面板排布如下&#xff1a; 编写脚本 创建一个文件夹&#xff0c;用于存放脚本&#xff0c;命名Scripts,创建一个子文件夹Effect,存放特效相关脚本&#xff0c;创建…...

深度学习中的结构化概率模型 - 使用图来描述模型结构篇

序言 在深度学习的探索之路上&#xff0c;结构化概率模型以其独特的视角和强大的表达能力&#xff0c;成为了研究复杂数据关系的重要工具。这一模型的核心在于其巧妙地利用图来描述模型结构&#xff0c;将随机变量间的复杂交互关系可视化、结构化。图的引入&#xff0c;不仅为…...

C语言中的栈帧

------------------------ | 局部变量区 | | (根据变量声明而变化) | ------------------------ | 参数区 | | (根据函数原型而变化) | ------------------------ | (可选) 保存寄存器区 | | (编译器/架构特定) | -…...

vue数组根据某些条件进行二次切割

原本的一个一维数组首先 1.根据depnm和bed的不同会分成不同的数组 2.在条件1的基础上分割出来的数组如果存在里面有isBgn1的会进行二次分割 比如原数组是[{depnm:1,bed:2,isBgn:0},{}……] 根据条件一会组成一个二维数组得到 [ [①depnm值一致的一个一维数组], [②bed值一…...

Yolov8改进轻量级网络Ghostnetv2

1,理论部分 轻量级卷积神经网络 (CNN) 专为移动设备上的应用程序而设计,具有更快的推理速度。卷积运算只能捕获窗口区域中的局部信息,这会阻止性能进一步提高。将自我注意引入卷积可以很好地捕获全局信息,但会在很大程度上阻碍实际速度。在本文中,我们提出了一种硬件友好…...

Medium作者收益预测模型:轻量可解释的写作价值评估系统

1. 项目概述&#xff1a;这不是一个“预测收入”的模型&#xff0c;而是一套写作者价值评估系统你点开这个标题&#xff0c;第一反应可能是&#xff1a;“哦&#xff0c;又一个用机器学习算稿费的工具&#xff1f;”——但实际远不止如此。Medium writer earnings&#xff08;M…...

别再死记公式了!用Cadence仿真带你直观理解比较器的增益、失调与噪声

Cadence实战&#xff1a;用仿真可视化比较器的增益、失调与噪声特性 刚接触模拟电路设计时&#xff0c;那些复杂的公式和抽象概念总让人头疼。比较器的增益、失调电压、噪声——这些名词在教科书上看起来冰冷生硬&#xff0c;但当你第一次在Cadence Virtuoso中看到它们如何真实…...

ESXi安装卡在网卡识别?除了打驱动,你还可以试试这个国产替代方案FreeVM

ESXi网卡兼容性困境&#xff1a;为何国产FreeVM可能更适合你的虚拟化需求 当你第5次重启ESXi安装程序&#xff0c;屏幕上依然显示"No Network Adapters"的红色报错时&#xff0c;那种挫败感任何IT从业者都深有体会。硬件兼容性问题——这个困扰虚拟化领域多年的顽疾&…...

硬件工程师,每天5分钟(5)——为什么 DDR5 最怕地不好?回流路径,才是高速设计真正的灵魂

讲透&#xff1a; 回流路径 为什么 Split Plane 最危险 为什么加地孔有时候能救命 为什么 GPS 会被 DDR 干扰 为什么 EMC 挂的根因常是地 &#x1f697;《硬件工程师&#xff0c;每天5分钟》第5篇 &#x1f525;《为什么 DDR5 最怕地不好&#xff1f;回流路径&#xff0c;才是高…...

动态图神经网络实现多商品时序协同预测

1. 项目概述&#xff1a;为什么传统时序模型在多商品预测中频频“掉链子”你有没有遇到过这样的场景&#xff1a;一家区域连锁超市的运营团队&#xff0c;每天盯着几十种SKU的销售数据发愁——酸奶销量突然飙升&#xff0c;但库存系统还在按上周的均值补货&#xff1b;新款保温…...

技术选型翻车实录:我们选的那个框架,两年后停止维护了

一、惊魂一刻&#xff1a;框架停更的暴击“紧急通知&#xff0c;我们一直使用的XX测试框架将于本月底停止维护&#xff01;”当这条消息出现在团队工作群时&#xff0c;整个测试部瞬间陷入死寂。作为一家中型电商企业的测试负责人&#xff0c;我清楚地知道&#xff0c;这个框架…...

维萨报告:AI 加速诈骗成消费者新危害,企业需提速应对

AI 加速类 ClickFix 诈骗还记得 ClickFix 吗&#xff1f;这是近年来流行的一种社会工程技术&#xff0c;它通过利用心理弱点绕过传统的网络钓鱼防御。在 ClickFix 攻击中&#xff0c;受害者会被呈现一个看似容易解决的问题&#xff0c;从而诱使他们自己执行恶意操作。例如&…...

共聚焦vs触针 :表面粗糙度测量原理及ISO25178兼容性分析

表面粗糙度测量是精密制造和质量控制的核心环节&#xff0c;直接影响产品耐磨性、摩擦性能及使用寿命。在工业和科研应用中&#xff0c;准确测量Ra参数不仅保证零件性能稳定&#xff0c;还满足ISO25178标准和ISO4287标准等国际标准要求。传统触针仪器虽然精度高&#xff0c;但操…...

Midjourney新艺术风格突然失效?92%用户忽略的--stylize冲突机制与3步回滚修复法

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;Midjourney新艺术风格突然失效&#xff1f;92%用户忽略的--stylize冲突机制与3步回滚修复法 近期大量用户反馈&#xff1a;在 Midjourney v6.1 中启用高 stylize 值&#xff08;如 --stylize 1000&#xff0…...

【AI绘画构图生死线】:为什么你的提示词再精准也出不了大片?——透视层级、视觉动线与负空间权重分配全拆解

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;AI绘画构图的底层认知革命 传统构图理论建立在人眼视觉经验与经典美学范式之上&#xff0c;而AI绘画的构图逻辑则根植于高维特征空间中的统计分布、注意力权重映射与跨模态对齐机制。当用户输入“晨雾中的孤松…...