行为型:观察者模式

article/2025/8/21 16:49:06

目录

1、核心思想

2、实现方式

2.1 模式结构

2.2 实现案例

3、优缺点分析

4、适用场景

5、注意事项


1、核心思想

目的:针对被观察对象与观察者对象之间一对多的依赖关系建立起一种行为自动触发机制,当被观察对象状态发生变化时主动对外发起广播,以通知所有观察者做出响应。核心目标是解耦主题与观察者。

举例

1> Websocket协议:不需要像Http轮询服务端的状态,服务端可以主动推送消息给客户端

2> 商店到货,通知购买者列表中的人来购物

2、实现方式

2.1 模式结构

四个核心角色:

  • Subject(目标主题)​:被观察的目标主题的接口抽象,维护观察者对象列表,并定义注册方法register()(订阅)与通知方法notify()(发布)​。
  • ConcreteSubject(主题实现)​:被观察的目标主题的具体实现类,持有一个属性状态State,维护观察者列表,并在状态变化时通知观察者。
  • Observer(观察者)​:观察者的接口抽象,定义响应方法update(),供主题调用。
  • ConcreteObserver(观察者实现)​:观察者的具体实现类,可以有任意多个子类实现。实现了响应方法update(),收到通知后进行自己独特的处理。

2.2 实现案例

当温度变化时,通知手机和电视更改温度显示:

//1、主题接口:注册、删除、通知观察者
public interface Subject {void registerObserver(Observer o);void removeObserver(Observer o);void notifyObservers();
}//2、主题实现:温度变化主题
public class WeatherStation implements Subject {private List<Observer> observers = new ArrayList<>();private float temperature;public void setTemperature(float temperature) {this.temperature = temperature;notifyObservers(); // 状态变化时通知观察者}@Overridepublic void registerObserver(Observer o) {observers.add(o);}@Overridepublic void removeObserver(Observer o) {observers.remove(o);}@Overridepublic void notifyObservers() {for (Observer o : observers) {o.update(temperature); // 推送数据给观察者}}
}//3、观察者接口
public interface Observer {void update(float temperature);
}//4、观察者实现:手机、电视
public class PhoneDisplay implements Observer {@Overridepublic void update(float temperature) {System.out.println("手机显示温度更新:" + temperature + "℃");}
}public class TVDisplay implements Observer {@Overridepublic void update(float temperature) {System.out.println("电视显示温度更新:" + temperature + "℃");}
}//5、客户端
public class Client {public static void main(String[] args) {WeatherStation station = new WeatherStation();PhoneDisplay phone = new PhoneDisplay();TVDisplay tv = new TVDisplay();// 注册观察者station.registerObserver(phone);station.registerObserver(tv);// 模拟温度变化station.setTemperature(25.5f); // 输出:// 手机显示温度更新:25.5℃// 电视显示温度更新:25.5℃// 移除一个观察者station.removeObserver(tv);station.setTemperature(30.0f); // 输出:手机显示温度更新:30.0℃}
}

两种数据传递方式:

  • 推模型(Push Model)

    主题主动将数据推送给观察者(如 update(temperature))。

  • 拉模型(Pull Model)

    观察者从主题拉取所需数据(如 update() 中调用 subject.getTemperature())。

3、优缺点分析

优点:

  • 解耦:主题与观察者无需知道彼此的具体实现。

  • 动态订阅:运行时动态添加或移除观察者。

  • 广播通信:支持一对多通知,适合事件驱动系统。

  • 遵循开闭原则:新增观察者无需修改主题代码。

缺点:

  • 通知顺序不可控:观察者更新顺序可能影响系统行为。

  • 性能问题:大量观察者或高频更新可能导致性能瓶颈。

  • 循环依赖风险:观察者与主题间不当引用可能导致死循环。

4、适用场景

  • 事件驱动系统

    • 如GUI按钮点击事件、消息队列通知。

  • 实时数据同步

    • 如股票价格变动通知、天气数据更新。

  • 跨模块状态同步

    • 如电商系统中库存变化触发订单状态更新。

  • 分布式系统

    • 如微服务架构中的配置中心推送更新。

5、注意事项

  • 避免内存泄漏

    观察者需及时取消注册(如Android中Activity销毁时移除监听)。

  • 线程安全

    多线程环境下需同步观察者列表(如使用 CopyOnWriteArrayList)。

  • 防止过度通知

    高频更新场景可采用批量通知或节流机制(如每秒最多通知一次)。


http://www.hkcw.cn/article/YamhkoPjbn.shtml

相关文章

中国已不是美留学生第一大来源国 印度反超夺魁

中国已不是美留学生第一大来源国 印度反超夺魁!赴美留学的国际学生中,中国已不再是最多的。根据最新数据,印度已成为美国高校留学生的第一大来源国,占比29.4%(约33.1万人),而中国排在第二位,占比24.6%(约27.7万人)。两国留学生人数合计已经超过一半。过去,中国长期占…

Unity-QFramework框架学习-MVC、Command、Event、Utility、System、BindableProperty

QFramework QFramework简介 QFramework是一套渐进式、快速开发框架&#xff0c;适用于任何类型的游戏及应用项目&#xff0c;它包含一套开发架构和大量的工具集 QFramework的特性 简洁性&#xff1a;QFramework 强调代码的简洁性和易用性&#xff0c;让开发者能够快速上手&a…

【代码训练营Day02】数组part2

文章目录 长度最小的子数组螺旋矩阵II数组总结 长度最小的子数组 题目链接&#xff1a;209. 长度最小的子数组 滑动窗口法的解题思路&#xff1a; 首先初始化双指针&#xff0c;都指向数组头部end指针依次向后滑&#xff0c;每向后滑一项就加一项&#xff0c;直到满足要求达到…

千年后中国人又在举国之力挖运河 新运河时代来临

千年后中国人又在举国之力挖运河 新运河时代来临!近日,浙江《关于高水平建设“航运浙江”的实施意见》正式实施,明确提出“谋划推进浙赣运河”。这一消息再次引起热议。作为浙赣粤运河的一部分,浙赣运河途经浙江杭州、衢州和江西上饶、鹰潭、南昌等城市,规划全长约760公里…

网关Gateway

目录 Gateway作用 Gateway使用 Gateway作用 在微服务项目中&#xff0c;没有引入网关时&#xff0c;项目架构如下&#xff1a; 引入网关后&#xff0c;架构如下&#xff1a; 引入网关后&#xff0c;有如下优势&#xff1a; 1、客户端请求经过网关向后台统一分发请求&#xff0c…

Python打卡训练营-Day15-复习日

浙大疏锦行 作业&#xff1a; 尝试找到一个kaggle或者其他地方的结构化数据集&#xff0c;用之前的内容完成一个全新的项目&#xff0c;这样你也是独立完成了一个专属于自己的项目。 要求&#xff1a; 有数据地址的提供数据地址&#xff0c;没有地址的上传网盘贴出地址即可。尽…

使用MFC 写dap上位机在线烧写FLASH

1.使用BUS Hound 抓取KEIL5 正常烧写的通讯包协议 2.结束DAP 源码分析每条数据&#xff0c;主要通讯靠05 和06 3.动态加载FLM烧写算法. 最终效果

Orcad 修复Pin Name重复问题

Duplicate Pin Name “VDD” found on Package 问题描述 1、Orcad创建网表时报错,错误,描述为Pin Name重复(在Orcad中是不允许非Power的pin type的Pin Name相同的) #26 ERROR(ORCAP-36041): Duplicate Pin Name “VDD” found on Package 处理方式 修

以军称拦截也门胡塞武装发射的一枚导弹

以色列国防军当地时间29日发表声明称,以空军当天拦截了也门胡塞武装发射的一枚导弹,包括特拉维夫在内的部分以色列中部地区当天响起防空警报。有报道称,耶路撒冷传出爆炸声。以色列急救组织表示,暂时没有接到关于此次导弹袭击的人员伤亡报告。△本古里安国际机场(资料图)…

从微积分到集合论(1630-1910)(历史简介)——第3章——数学分析的出现及其基础性进展(1780-1880)(I.Grattan-Guinness)

第 3 章 数学分析的出现及其基础性进展 (The Emergence of Mathematical Analysis and its Foundational Progress,1780-1880) Grattan-Guinness 目录 3.1 数学分析及其与代数和几何的关系(Mathematical analysis and its relationship to algebra and geometry) 3.2 …

2-向量可视化

确定适用于向量的绘图类型 任务一 plot(Year,Aus_Can); 任务二 area(Year,Aus Can) 结果 任务三 stem(Year,Aus_Can) 自定义绘图属性 %任务一 plot(Year,Australia,"-ok") 结果 表示&#xff1a;&#xff08;按要求完成任务&#xff09; 用 黑色实线 连接数据点…

语音识别中的XML语法应用范例

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;XML是一种标记语言&#xff0c;用于数据传输和存储&#xff0c;而非显示。在语音识别中&#xff0c;它负责定义和结构化语音识别语法&#xff0c;通过元素如词汇、发音规则和语法限制等&#xff0c;帮助计算机理…

B站bilibili视频转文字字幕下载方法

本文将讲述介绍一种使用本地工具如何快速的下载B站的字幕为本地文本文件的方法。 通常获取B站字幕需要在浏览器中安装第三方插件&#xff0c;通过插件获取字幕。随着大模型&#xff0c;生成式AI&#xff0c;ChatGPT的应用&#xff0c;B站也提供了AI小助手对视频的内容进行总结…

计算机视觉图像处理基础系列:滤波、边缘检测与形态学操作

计算机视觉图像处理基础系列:滤波、边缘检测与形态学操作 一、前言二、滤波:图像的精细化处理​2.1 滤波基础概念​2.1.1 滤波的本质​2.1.2 图像噪声来源与类型​2.2 线性滤波​2.2.1 均值滤波​2.2.2 高斯滤波​2.3 非线性滤波​2.3.1 中值滤波​三、边缘检测:图像轮廓的精…

Kimi-Audio音频大模型介绍、本地部署与开发

目录 一、模型介绍 二、模型部署 1、创建工作空间 2、下载模型 3、下载依赖 4、下载模型库 5、下载glm4_tokenizer 6、代码编程修改 4 月 26 日&#xff0c;Moonshot AI正式宣布推出Kimi-Audio&#xff0c;一款全新的开源音频基础模型&#xff0c;旨在推动音频理解、生…

YOLO11n动态库部署实战:Windows11 + C++ + OpenCV + DDL完整封装流程详解(保姆级教程)

文章目录 前言一、Windows11CPU算法环境搭建1. 安装pycharm2. 安装python 3.8.103. 安装pytorch 1.13.04. 安装mingw64 14.2.05. 安装cmake 3.31.66. 安装 Visual Studio 2022 二、运行YOLO模型并转换为ONNX文件1. 下载yolo11源码和 ultralytics-8.3.31-py3-none-any.whl 文件2…

AI视频自动生成本地部署,完美实现“剪映”图文成片功能

项目说明 本项目仅适用于学习和研究&#xff0c;不得用于商业使用。所有推荐开源项目本人都亲测可运行。如有侵权&#xff0c;请通知删除。 项目简介 只需提供一个视频 主题 或 关键词 &#xff0c;就可以全自动生成视频文案、视频素材、视频字幕、视频背景音乐&#xff0c;然…

计算机视觉常用数据集Cityscapes的介绍、下载、转为YOLO格式进行训练

我在寻找Cityscapes数据集的时候花了一番功夫&#xff0c;因为官网下载需要用公司或学校邮箱邮箱注册账号&#xff0c;等待审核通过后才能进行下载数据集。并且一开始我也并不了解Cityscapes的格式和内容是什么样的&#xff0c;现在我弄明白后写下这篇文章&#xff0c;用于记录…

抖音采集工具Gui版:高效无水印下载抖音视频的神器

抖音采集工具Gui版是一款由52pojie论坛的biqiang大神自制的功能强大的采集工具。 它专为抖音视频下载设计&#xff0c;能够帮助用户轻松获取抖音平台上的各种视频资源&#xff0c;支持批量下载&#xff0c;极大地提升了下载效率。 全面的资源采集 支持采集抖音作品、Webp动态封…

YOLOv11实时目标检测 | 摄像头视频图片文件检测

在上篇文章中YOLO11环境部署 || 从检测到训练https://blog.csdn.net/2301_79442295/article/details/145414103#comments_36164492&#xff0c;我们详细探讨了YOLO11的部署以及推理训练&#xff0c;但是评论区的观众老爷就说了&#xff1a;“博主博主&#xff0c;你这个只能推理…