【设计模式】观察者模式
什么是观察者模式?
观察者模式(又被称为发布-订阅(Publish/Subscribe)模式,属于行为型模式的一种,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。
观察者模式的角色:
Subject:抽象主题(被观察者),每一个主题可以有多个观察者,并将所有观察者对象的引用保存在一个集合里,被观察者提供一个接口,可以增加和删除观察者角色
ConcreteSubject:具体主题,将有关状态存入具体观察者对象,在主题发生改变时,给所有的观察者发出通知
Observer:抽象观察者,为所有的具体观察者定义一个更新接口,该接口的作用是在收到主题的通知时能够及时的更新自己
ConcreteObserver:具体观察者,实现抽象观察者角色定义的更新接口,以便使本身的状态与主题状态相协调。如果需要,具体观察者角色可以保存一个指向具体主题角色的引用。
参考来自设计模式(五)观察者模式,作者:刘望舒
观察者模式的使用场景:
观察者模式是一种对象行为型模式,它通常用于以下场景:
- 消息服务器系统。
- 社交媒体平台。
- 邮件系统。
- 图形界面应用程序。
- 游戏。
- 实现团队协作,提高工作效率。
- 观察者模式可以在不同对象之间创建有效关系,从而更有效地开发高质量软件。
具体实现:
假设有这么一个场景:我是B站up主,有很多粉丝关注我,我发视频了,他们就会点赞我,我发癫了(说些不好的话)他们就会取关我。
在这种场景下,就很使用观察者模式,粉丝们关注我,根据我的状态而动态地做出反应。
观察者的接口
public interface MyObserver {void execute(String upName);
}
观察者对象
public class fans implements MyObserver {private String name;public fans(String name){this.name = name;}// 根据msg动态地执行方法@Overridepublic void execute(String msg) {if("更新了".equals(msg)){System.out.println(this.name+"点赞了你");}if("发癫了".equals(msg)){System.out.println(this.name+"举报了你");}}
}
被观察者接口
public interface SupObject {// 将粉丝增加在通知列表void add(MyObserver myObserver);// 将粉丝删除出通知列表void delete(MyObserver myObserver);// 通知void notify(String upName);
}
被观察者对象
public class up implements SupObject{List<MyObserver> notifyList = new ArrayList<>();@Overridepublic void add(MyObserver myObserver) {notifyList.add(myObserver);}@Overridepublic void delete(MyObserver myObserver) {notifyList.remove(myObserver);}@Overridepublic void notify(String msg) {notifyList.forEach(t-> t.execute(msg));}
}
执行器
public class client {public static void main(String[] args) {fans fans1 = new fans("小约翰可汗");fans fans2 = new fans("CSGO玩机器");fans fans3 = new fans("徐云流浪中国");up up = new up();up.add(fans1);up.add(fans2);up.add(fans3);up.notify("更新了");}
}
效果:

观察者模式的优缺点:
优点
解除耦合,让耦合的双方都依赖于抽象,从而使得各自的变换都不会影响另一边的变换。
缺点
在应用观察者模式时需要考虑一下开发效率和运行效率的问题,程序中包括一个被观察者、多个观察者,开发、调试等内容会比较复杂,而且在Java中消息的通知一般是顺序执行,那么一个观察者卡顿,会影响整体的执行效率,在这种情况下,一般会采用异步实现。
观察者模式和发布订阅模式的不同:
通过上面的代码,可能回产生这样的疑问?
这不是“被观察者”主动发送消息给“观察者”的吗?这么叫做观察者模式呢?主被动关系是不是搞反了?
其实观察者模式也叫做发布订阅模式。
比如《heah in first》中,就曾这么写
Publishers + Subscribers = Observer Pattern
但是!他们还是有差别的
在发布订阅模式里,发布者,并不会直接通知订阅者,换句话说,发布者和订阅者,彼此互不相识。
但在观察者模式中,观察者与被观察者是直接通信的。
这就是他们的差别:
观察者模式主打一个松耦合,但是他们还是耦合的。
但是发布订阅模式,完完全全的松开了!
相关文章:
【设计模式】观察者模式
什么是观察者模式? 观察者模式(又被称为发布-订阅(Publish/Subscribe)模式,属于行为型模式的一种,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态…...
ORCA优化器浅析——CDXLOperator Base class for operators in a DXL tree
如上图所示,CDXLOperator作为Base class for operators in a DXL tree,其子类CDXLLogical、CDXLScalar、CDXLPhysical作为逻辑节点、物理节点和Scalar节点的DXL表示类,因此其包含了这些类的共同部分特性,比如获取其DXL节点表示的函…...
go入门实践四-go实现一个简单的tcp-socks5代理服务
文章目录 前言socks协议简介go实现一个简单的socks5代理运行与压测抓包验证 前言 SOCKS是一种网络传输协议,主要用于客户端与外网服务器之间通讯的中间传递。协议在应用层和传输层之间。 本文使用先了解socks协议。然后实现一个socks5的tcp代理服务端。最后&#…...
div 中元素居中的N种常用方法
本文主要记录几种常用的div盒子水平垂直都居中的方法。本文主要参考了该篇博文并实践加以记录说明以加深理解记忆 css之div盒子居中常用方法大全 本文例子使用的 html body结构下的div 盒子模型如下: <body><div class"container"><div c…...
Java获取指定文件夹下目录下所有视频并复制到另一个地方
import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.StandardCopyOption;public class VideoCopier {public static void main(String[] args) {// 指定源文件夹路径和目标文件夹路径String sourceFolderPath "path/to…...
windows server 2016 搭建使用 svn 服务器教程
参考教程: https://zhuanlan.zhihu.com/p/428552058 https://blog.csdn.net/weixin_33897722/article/details/85602029 配置环境 windows server 2016 远程服务器公网 ip 安装 SVN 服务端 下载 svn 服务端安装包:https://www.visualsvn.com/download…...
【Python】如何判断时间序列数据是否为平稳时间序列或非平稳时间序列?
判断时间序列数据是否为平稳时间序列或非平稳时间序列,通常可以通过以下方法: (1)观察时间序列数据的均值和方差是否随时间变化而发生明显的改变。若均值和方差变化明显,则该时间序列数据可能为非平稳时间序列&#x…...
Labview控制APx(Audio Precision)进行测试测量(六)
用 LabVIEW 驱动 VIs生成任意波形 在 APx500 应用程序中,默认波形类型为正弦。这是指 APx 内置的正弦发生器,根据信号路径设置,许多测量还允许其他内置波形,如方波,分裂正弦波或分裂相位,以及使用导入的。w…...
【Linux】网络协议总结
目录 网络协议总结 应用层 传输层 网络层 数据链路层 网络协议总结 应用层 应用层的作用:负责应用程序间沟通,完成一系列业务处理所需服务。能够根据自己的需求,设计对应的应用层协议。了解HTTP协议。理解DNS的原理和工作流程。 传…...
如何轻松注册企业邮箱?快速掌握超简单的注册技巧!
随着互联网的发展,越来越多的企业开始使用电子邮件作为通信工具。企业邮箱不仅可以提高企业的工作效率,还可以使企业通信更加便捷、保密性更高。那么,企业邮箱怎么注册申请呢?下面我们来详细介绍一下。 第一步:选择邮箱…...
【行为型设计模式】C#设计模式之观察者模式
题目:假设你正在开发一个简单的新闻发布系统,该系统允许用户订阅不同的新闻频道,并在有新闻发布时向订阅者发送通知。使用观察者模式设计和实现该系统。观察者模式的相关概念和定义: 观察者模式是一种行为设计模式,它定…...
《Java面向对象程序设计》学习笔记——第 8 章 设计模式
专栏:《Java面向对象程序设计》学习笔记 第 8 章 设计模式 一个好的设计系统往往是易维护、易扩展、易复用的。 8.1 设计模式简介 8.1.1 什么是设计模式 一个设计模式 (pattern) 是针对某一类问题的最佳解决方案,而且己经被成功应用于许多系统的设…...
Java学习笔记28——字节流1
IO流概述和分类 IO流IO流的分类字节流字节流写数据FileOutputStream字节流写数据的三种方式字节流写数据的两个问题字节流写数据加异常处理 IO流 IO:输入输出 流:一种抽象的概念,是对数据传输的总称,流的本质就是数据传输 IO流的…...
C++连接串口方式(MFC版本)(简单版本)
ComSerialPort.h /*_________________________串口________________________________*/class Com_SerialPort { public:Com_SerialPort();Com_SerialPort(int port, int baudRate, int byteSize, int parity, int stopBits);~Com_SerialPort(); public:bool Connect(bool bMut…...
ospf重发布
华子目录 一、实验拓扑二、实验要求三、实验思路1、配置接口IP地址以及环回地址(以此类推)2、配置动态路由协议3、重发布4、更改接口类型5、配置路由策略 一、实验拓扑 二、实验要求 1、使用双点双向重发布2、所有路由器进行最佳选路3、存在备份路径&am…...
基于weka手工实现K-means
一、K-means聚类算法 K均值聚类(K-means clustering)是一种常见的无监督学习算法,用于将数据集中的样本划分为K个不同的类别或簇。它通过最小化样本点与所属簇中心点之间的距离来确定最佳的簇划分。 K均值聚类的基本思想如下: …...
分布式系统监控zabbix安装部署及使用
分布式系统监控zabbix安装部署及使用 一.zabbix监控 1.什么是zabbix zabbix:是一款开源免费的,自动化发现服务与网络设备的分布式监控,可以监视应用层服务并以web前端页面集中管理并展示。 2.zabbix功能 监控服务器cpu负载、服务器内存使…...
【H5】使用 JavaScript 和 CSS 来完成实现鼠标接触时显示一个图片弹窗
以下是一个示例,演示了如何在鼠标接触时显示一个图片弹窗: HTML: <a href"#" class"popup-link" target"_blank"><i class"fab fa-weixin"></i> </a><div id"popup-containe…...
CSS选择器分类梳理并高亮重点
前言 主要内容来自菜鸟教程 CSS 选择器 | 菜鸟教程 分类是我自己理解的分类,示例说明优化统一了表述风格。 正文 选择器CSS示例示例说明基础*2*选择所有元素:root3:root选择文档的根元素element1p选择所有<p>元素:not(selector)3:not(p)选择所有并非p元素…...
Python批量给excel文件加密
有时候我们需要定期给公司外部发邮件,在自动化发邮件的时候需要对文件进行加密传输。本文和你一起来探索用python给单个文件和批量文件加密。 python自动化发邮件可参考【干货】用Python每天定时发送监控邮件。 文章目录 一、安装pypiwin32包二、定义给excel加…...
OpenFace面部分析实战:多模态行为理解的完整解决方案
OpenFace面部分析实战:多模态行为理解的完整解决方案 【免费下载链接】OpenFace OpenFace – a state-of-the art tool intended for facial landmark detection, head pose estimation, facial action unit recognition, and eye-gaze estimation. 项目地址: htt…...
具身智能(8):EtherCAT IGH+ROS2扩展:ROS2-Controller
一、ROS2-Controllers 完整集成(工业标准接口) 1. 核心目标 实现 joint_trajectory_controller(轨迹跟踪)、joint_state_broadcaster(状态广播)与 IgH 主站的对接,兼容 ROS2 运动控制生态,支持 MoveIt! 规划器直接下发轨迹。 2. 依赖安装 # 安装 ROS2-Controllers …...
.NET 磁盘BitLocker加密-技术选型览
在之前的文章中,我们花了大量的篇幅,从记录后端pod真实ip开始说起,然后引入envoy,再解决了各种各样的需求:配置自动重载、流量劫持、sidecar自动注入,到envoy的各种能力:熔断、流控、分流、透明…...
提升Docker镜像构建效率的10个秘诀:Docker Buildx和Bake高级构建技巧
提升Docker镜像构建效率的10个秘诀:Docker Buildx和Bake高级构建技巧 【免费下载链接】docs Source repo for Dockers Documentation 项目地址: https://gitcode.com/gh_mirrors/docs3/docs Docker Buildx和Bake是Docker生态系统中强大的高级构建工具&#x…...
百考通:AI精准赋能答辩PPT,让零散的想法智能生成为结构化内容
毕业季、开题季,一份专业出彩的PPT是顺利通过答辩的关键。但从论文中提炼核心观点、规划答辩逻辑、设计美观版式,往往让学生们焦头烂额。百考通(https://www.baikaotongai.com) 凭借AI技术深度赋能,打造出一站式答辩PP…...
VibePaper测了我的脑内小剧场:它偷走了我的分镜灵魂
VibePaper测了我的脑内小剧场:它在30秒里偷走了我的分镜灵魂事情是这样的—— 我对着 VibePaper 说了一句:“一个男人在梦里反复推开同一扇门,每次门后的世界都不一样。” 然后它用了不到30秒,还给我: 4个分镜图 2段动…...
STM32F103 HAL库实战:DMA+USART驱动RS-485半双工通讯
1. RS-485通讯基础与STM32方案选型 在工业自动化领域,RS-485总线因其抗干扰能力强、传输距离远(最长1200米)、支持多点连接(最多32个节点)等特性,成为传感器网络、PLC控制等场景的首选。与常见的UART不同&a…...
STM32F103片内Flash读写避坑指南:CubeMX配置虽简单,但这几个细节错了就HardFault
STM32F103片内Flash读写避坑指南:从硬件机制到实战优化 第一次在项目中尝试使用STM32片内Flash存储设备运行日志时,系统每隔几天就会莫名其妙死机。通过逻辑分析仪抓取异常时刻的波形,发现每次HardFault都发生在Flash写入操作后的20μs内。这…...
2026奇点大会语音合成赛道黑马突围战:3家初创公司如何用<1/10算力达成SOTA效果?技术栈拆解与模型蒸馏全流程图谱
第一章:2026奇点智能技术大会:大模型语音合成 2026奇点智能技术大会(https://ml-summit.org) 语音合成技术的范式跃迁 在2026奇点智能技术大会上,大模型驱动的语音合成(TTS)已突破传统拼接与参数化框架的边界&#x…...
Claude顾问策略技术深度解析:Opus 4.6幕后指挥,Sonnet/Haiku高效执行
技术分析:Anthropic顾问策略架构设计与性能优化实现原理 前言:AI Agent架构的革命性突破 2026年3月,Anthropic正式发布Claude"顾问策略"(Advisor Strategy),这一技术架构彻底改变了传统AI Agent…...
