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

设计模式 - Observer Pattern 观察者模式

文章目录

  • 定义
  • 观察者模式的实现构成
    • 构成
    • UML图
  • 观察者模式的代码实现
    • 场景
    • 代码实现
  • 总结
    • 优点
    • 缺点
    • 应用场景
  • 其他设计模式文章:

定义

观察者模式是行为型模式的一种,它定义对象间的一种一对多的依赖关系,使得每当一个对象改变状态,它的所有依赖都会收到通知并且自动更新状态。

简单来说就是:当一个行为发生时传递信息给另外一个用户接收做出相应的处理,它们之间其实没有什么直接的关联。

观察者模式的实现构成

构成

 1. 主题(Subject):抽象主题,提供方法来增加和删除观察者,当自身状态发生改变时,通知所有观察者。
 2. 观察者(Observer):抽象观察者,用于接收主题状态更新的通知。
 3. 具体主题(Concrete Subject):实现主题接口、在其内部状态发生改变时,通知所有注册的观察者。
 4. 具体观察者(Concrete Observer):实现观察者接口、在接收到主题的通知时更新自身状态。

UML图

在这里插入图片描述

观察者模式的代码实现

场景

假设我们有一个股票价格监控系统,不同的模块(图表模块、统计模块和警报模块),它们需要实时更新股票价格信息。当股票价格发生变化时,这些模块就立即可以获取到通知并且可以进行更新显示。

代码实现

观察者接口
// 观察者接口,定义更新方法
interface Observer {// 当主题状态变化时调用此方法通知观察者。void update(double price);
}
具体观察者
// 具体观察者:图表模块
class ChartDisplay implements Observer {@Overridepublic void update(double price) {System.out.println("图表模块更新股票价格: " + price);}
}// 具体观察者:统计模块
class StatisticsDisplay implements Observer {@Overridepublic void update(double price) {System.out.println("统计模块更新股票价格: " + price);}
}// 具体观察者:警报模块
class AlertSystem implements Observer {@Overridepublic void update(double price) {if (price > 100.0) {System.out.println("警报!股票价格超过100元: " + price);}}
}
主题接口
// 主题接口,定义增加、删除观察者及通知方法,用于管理和通知观察者。
interface Subject {void addObserver(Observer observer);void removeObserver(Observer observer);void notifyObservers();
}
具体主题
// 具体主题:实现了Subject,用来维护观察者列表并在价格变化时通知所有观察者。
class StockPrice implements Subject {private List<Observer> observers;private double price;public StockPrice() {observers = new ArrayList<>();}@Overridepublic void addObserver(Observer observer) {observers.add(observer);}@Overridepublic void removeObserver(Observer observer) {observers.remove(observer);}@Overridepublic void notifyObservers() {for (Observer observer : observers) {observer.update(price);}}// 设置新价格并通知观察者public void setPrice(double price) {this.price = price;notifyObservers();}
}
客户端代码
// 客户端代码
public class ObserverPatternDemo {public static void main(String[] args) {// 创建具体主题StockPrice stockPrice = new StockPrice();// 创建具体观察者ChartDisplay chartDisplay = new ChartDisplay();StatisticsDisplay statisticsDisplay = new StatisticsDisplay();AlertSystem alertSystem = new AlertSystem();// 注册观察者stockPrice.addObserver(chartDisplay);stockPrice.addObserver(statisticsDisplay);stockPrice.addObserver(alertSystem);// 更新股票价格stockPrice.setPrice(95.0);System.out.println();stockPrice.setPrice(105.0);}
}

总结

优点

 1. 解耦:主题只需知道观察者实现了某个接口,不需要知道具体实现细节,双方可以独立变化。
 2. 目标与观察者之间建立了一套触发机制。

缺点

 1. 当观察者对象很多时,通知的发布会花费很长时间,影响程序的效率。
 2. 如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。

应用场景

 跨系统的消息交换场景,如消息队列,事件总线的处理机制

其他设计模式文章:

  • 设计模式 - Singleton pattern 单例模式
  • 设计模式 - Factory Method 工厂方法
  • 设计模式 - Chain Of Responsibility 责任链模式
  • 设计模式 - Template Method 模板方法
  • 设计模式 - Strategy Pattern策略模式
  • 设计模式 - Observer Pattern 观察者模式

相关文章:

设计模式 - Observer Pattern 观察者模式

文章目录 定义观察者模式的实现构成构成UML图 观察者模式的代码实现场景代码实现 总结优点缺点应用场景 其他设计模式文章&#xff1a; 定义 观察者模式是行为型模式的一种&#xff0c;它定义对象间的一种一对多的依赖关系&#xff0c;使得每当一个对象改变状态&#xff0c;它…...

【面试系列】C++ 高频面试题

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来&#xff1a;详细讲解AIGC的概念、核心技术、…...

程序猿大战Python——实现简单的图书馆系统操作

步骤1&#xff1a;安装和导入库 首先&#xff0c;确保已经安装了 pymysql 库。如果没有安装&#xff0c;请执行以下命令&#xff1a; pip install pymysql 然后&#xff0c;导入必要的库&#xff1a; import pymysql 步骤2&#xff1a;创建数据库和表的函数 编写一个函数来…...

液体粒子计数器的原理及常见型号选择 lighthouse代理商北京中邦兴业

​液体颗粒计数用于测量液体样品中颗粒的大小和分布。通过用激光二极管照射液体样品并检测散射光来测量颗粒分布和尺寸。散射光的性质与粒子大小的大小有关。液体颗粒计数器可用于批量取样或在线&#xff08;连续监测&#xff09;应用&#xff0c;如水处理厂&#xff0c;或用于…...

Java知识点整理 16 — Spring Bean

在之前的文章 Java知识点整理 8 — Spring 简介 中介绍了 Spring 的两大核心概念 IoC 和 AOP&#xff0c;但对 Spring Bean 的介绍不全面&#xff0c;本文将补充 Spring 中 Bean 的概念。 一. 什么是 Spring Bean 在 Spring 官方文档中&#xff0c;对 bean 的定义为&#xf…...

Nvidia Jetson/RK3588+AI双目立体相机,适合各种割草机器人、扫地机器人、AGV等应用

双目立体视觉是基于视差原理&#xff0c;依据成像设备从不同位置获取的被测物体的图像&#xff0c;匹配对应点的位置偏移&#xff0c;得到视差数据&#xff0c;进而计算物体的空间三维信息。为您带来高图像质量的双目立体相机&#xff0c;具有高分辨率、低功耗、远距离等优点&a…...

springboot使用feign调用不依赖cloud

在使用spring boot调用第三方api中&#xff0c;常用的是okhttp、apache http client等&#xff0c;但是直接使用下来还是有点繁琐&#xff0c;需要手动转换实体。 在springcloud中有个openfeign调用&#xff0c;第一次体验到调用接口还能这么丝滑。注解写道接口上&#xff0c;…...

springboot中使用springboot cache

前言&#xff1a;SpringBoot中使用Cache缓存可以提高对缓存的开发效率 此图片是SpringBootCache常用注解 Springboot Cache中常用注解 第一步&#xff1a;引入依赖 <!--缓存--><dependency><groupId>org.springframework.boot</groupId><artifactId…...

Promise,async/await的运用

一&#xff0c;了解Promise Promise是异步编程的一种解决方案&#xff0c;它是一个对象&#xff0c;可以获取异步操作的消息&#xff0c;它的出现避免了地狱回调。 &#xff08;1&#xff09;Promise的实例有三个状态&#xff1a; Pending&#xff08;进行中&#xff09; Re…...

图论·多源最短路径Floyddijsktra

例题地址 多源最短路径 多个源点多个终点可以使用Floyd算法直接求各源点到终点的最短距离&#xff0c;也可以直接多次使用dijsktra算法求单源点到终点的最短距离 Floyd算法 使用条件 多源最短路径权值正负皆可 核心思想&#xff1a;动态规划 子问题&#xff1a; 设(A,B)…...

微服务 | Springboot整合GateWay+Nacos实现动态路由

1、简介 路由转发 执行过滤器链。 ​ 网关&#xff0c;旨在为微服务架构提供一种简单有效的统一的API路由管理方式。同时&#xff0c;基于Filter链的方式提供了网关的基本功能&#xff0c;比如&#xff1a;鉴权、流量控制、熔断、路径重写、黑白名单、日志监控等。 基本功能…...

做google SEO 有哪些好用的工具?这12款谷歌SEO工具值得收藏!

1、Google Trends 谷歌旗下一款基于搜索数据推出的一款免费分析工具 外贸人有句老话&#xff0c;七分靠选品&#xff0c;三分靠运营。在你开始做独立站之前&#xff0c;在你不清楚你的行业在Google上面能否有足够的流量时&#xff0c;那么Google Trends则是你最好的工具。 你只…...

【变频调速在锅炉引风机控制中的应用】

变频调速在锅炉引风机控制中的应用 变频器的选型 变频器是利用电力半导体器件的通断作用将工频电源变换为另一种频率的电能控制装置,能宏观对交流异步电机软启动,变频调速,提高运转精度,改变功率因数,过流/过压/过载保护等功能,国内技术较领先的品牌有汇川、欧瑞(原烟台…...

网络配置(IP、NETMASK、GATEWAY、DNS、DHCP) <持续更新中>

参考&#xff1a; 初学Linux之网络配置(IP、NETMASK、GATEWAY、DNS、DHCP)-CSDN博客【学习笔记】网关 & 路由_网关和路由-CSDN博客【学习笔记】计算机网络 IP地址与MAC地址_根据mac分配ip-CSDN博客【学习笔记】TCP 和 UDP 协议_tcp 发送 syn 应答没有syn ack-CSDN博客 一…...

【ArcGIS 脚本工具】拯救密恐,隐藏唯一值渲染图层的标记符号

最近拿到了【Hello 图狗】制作的三调/变更样式符号库&#xff0c;确实比之前网上下载的版本好用很多。 ArcGIS Pro三调23变更符号库V1.02&#xff08;汇总&#xff09;_中大比例尺.stylx和样式属性对调 不过使用过程中触发了一个旧病&#xff0c;就是匹配样式之后&#xff0c;…...

tensorflow学习1.3-创建会话,启动会话

tensorflow学习1.3-创建会话&#xff0c;启动会话 会话的由来与作用由来作用 会话的定义与结构定义 用法基本用法上下文管理器执行部分计算图获取多个结果 总结 练习代码报错原因&#xff1a;TensorFlow 2.x中的Eager Execution使用兼容模式来启用SessionEager Execution和计算…...

QT基本对话框(基本对话框、工具盒类、进度条、调色板与电子钟、可扩展对话框、程序启动画面)

此篇文章通过实例介绍基本对话框的用法。首先介绍标准文件对话框&#xff08;QFileDialog&#xff09;、标准颜色对话框&#xff08;QColorDialog&#xff09;、标准字体对话框&#xff08;QFontDialog&#xff09;、标准输入对话框&#xff08;QInputDialog&#xff09;以及标…...

Docker 部署 MariaDB 数据库 与 Adminer 数据库管理工具

文章目录 MariaDBmariadb.cnf开启 binlog Adminerdocker-compose.ymlAdminer 连接 MariaDB MariaDB MariaDB是一个流行的开源关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它是MySQL的一个分支和替代品。 官网&#xff1a;https://mariadb.com/镜像&#xff…...

qt 可以在一个函数中读一个文件,然后再将内容写入另一个文件中

是的&#xff0c;Qt 允许你在一个函数中读取一个文件的内容&#xff0c;并将这些内容写入到另一个文件中。这可以通过结合使用 QFile 和 QTextStream&#xff08;或 QDataStream&#xff0c;取决于你的具体需求&#xff09;来实现。以下是一个简单的示例&#xff0c;展示了如何…...

Dijkstra算法C代码

一个带权图n个点m条边&#xff0c;求起点到终点的最短距离 先定义一个邻接矩阵graph&#xff0c;graph[i][j]表示从i到j的距离&#xff0c;i到j没有路就表示为无穷 然后定义一个visit数组&#xff0c;visit[i]表示i结点是否被访问 然后定义一个dist数组&#xff0c;dist[i]表…...

Huxley框架PDF生成利器:基于HTML模板的优雅解决方案

1. 项目概述&#xff1a;一个为Huxley框架量身定制的PDF生成利器如果你正在使用Huxley框架开发应用&#xff0c;并且遇到了需要生成PDF报告、发票、合同或者任何形式文档的需求&#xff0c;那么你很可能已经体会过那种“万事俱备&#xff0c;只欠PDF”的纠结。市面上的PDF生成库…...

特斯拉Model 3车主必看:用华为随行WiFi+流量卡,低成本搞定车载WiFi(附Type-C供电方案)

特斯拉Model 3车主必看&#xff1a;低成本车载WiFi实战指南 特斯拉Model 3的车载娱乐系统依赖网络连接&#xff0c;但官方高级娱乐服务的月费让不少车主犹豫。更糟的是&#xff0c;部分地区的4G信号覆盖不佳&#xff0c;导致在线音乐、实时路况等功能形同虚设。本文将分享一套经…...

如何快速掌握Spinning Up超参数调优:提升深度强化学习性能的终极指南

如何快速掌握Spinning Up超参数调优&#xff1a;提升深度强化学习性能的终极指南 【免费下载链接】spinningup An educational resource to help anyone learn deep reinforcement learning. 项目地址: https://gitcode.com/gh_mirrors/sp/spinningup Spinning Up是一款…...

答辩前 3 天,我用 PaperXie 的 AI PPT 功能,把答辩 PPT 从 0 改到了能直接上台

paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AI PPThttps://www.paperxie.cn/ppt/createhttps://www.paperxie.cn/ppt/create 凌晨两点的宿舍里&#xff0c;电脑屏幕的蓝光映着你布满红血丝的眼睛。文件夹里躺着写了半个月的毕业论文终稿&#xff0c;旁…...

如何用DouyinLiveWebFetcher实现抖音直播数据自动化采集与智能分析

如何用DouyinLiveWebFetcher实现抖音直播数据自动化采集与智能分析 【免费下载链接】DouyinLiveWebFetcher 抖音直播间网页版的弹幕数据抓取&#xff08;2025最新版本&#xff09; 项目地址: https://gitcode.com/gh_mirrors/do/DouyinLiveWebFetcher 面对直播电商的爆发…...

Cursor智能体工具包:从代码助手到自主编程代理的进化

1. 项目概述&#xff1a;从“智能代码补全”到“自主编程代理”的进化如果你和我一样&#xff0c;在过去一两年里深度使用过Cursor&#xff0c;那么你对它的第一印象大概率是“一个集成了AI的现代化代码编辑器”。它确实把智能代码补全、聊天式编程和代码理解做到了一个新高度&…...

软考资料全集

距离2026年上半年软考&#xff08;5月开考&#xff09;已不算遥远&#xff0c;现在正是着手准备的好时机。回顾这几年的备考历程&#xff0c;我也曾为找资料花费不少时间。趁着这次整理&#xff0c;我把手头积累的各科目复习资料——全部来自互联网公开渠道——系统地归拢了一下…...

Claude Code 与 OpenClaw 分道扬镳:一场关于 AI 工具生态的深层博弈

Claude Code 与 OpenClaw 分道扬镳&#xff1a;一场关于 AI 工具生态的深层博弈 2025 年的开发者社区再次被一则消息引爆&#xff1a;Anthropic 决定不再允许 Claude Code 订阅用户使用 OpenClaw。这条消息在 Hacker News 上迅速获得了超过 590 票的热度&#xff0c;成为技术圈…...

开源协作团队实践:从零构建高效技术团队的“团队即代码”方法论

1. 项目概述&#xff1a;一个开源协作团队的诞生与运作最近在GitHub上看到一个挺有意思的项目&#xff0c;叫jefferyjob/openclaw-it-team。光看这个名字&#xff0c;可能有点摸不着头脑&#xff0c;它不像一个具体的软件工具或框架&#xff0c;更像是一个团队或组织的代号。没…...

主权身份技术解析:从DID、可验证凭证到零知识证明的完整架构与实践

1. 项目概述与核心价值最近在数字身份领域折腾&#xff0c;发现一个叫“TamTunnel/sovereign-identity”的项目挺有意思。这个名字乍一看有点抽象&#xff0c;但拆开来看&#xff0c;“sovereign-identity”直译就是“主权身份”&#xff0c;而“TamTunnel”像是一个代号或通道…...