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

23种设计模式-行为型模式之观察者模式(Java版本)

Java 观察者模式(Observer Pattern)详解

🧠 什么是观察者模式?

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


🎯 使用场景

  • 一个对象状态的变化需要通知多个对象
  • 系统中存在一对多的依赖关系
  • 实现事件处理系统(如GUI、订阅/发布)

🏗️ 模式结构

  • Subject(主题):被观察的对象,提供注册和移除观察者的方法
  • Observer(观察者):定义响应更新的方法
  • ConcreteSubject / ConcreteObserver:具体实现类

✅ 示例:天气预报系统

观察者接口(Observer)

public interface Observer {void update(float temperature, float humidity, float pressure);
}

主题接口(Subject)

public interface Subject {void registerObserver(Observer o);void removeObserver(Observer o);void notifyObservers();
}

具体主题类

import java.util.ArrayList;
import java.util.List;public class WeatherData implements Subject {private List<Observer> observers = new ArrayList<>();private float temperature;private float humidity;private float pressure;@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, humidity, pressure);}}public void setMeasurements(float temperature, float humidity, float pressure) {this.temperature = temperature;this.humidity = humidity;this.pressure = pressure;notifyObservers();}
}

具体观察者类

public class CurrentConditionsDisplay implements Observer {private float temperature;private float humidity;@Overridepublic void update(float temperature, float humidity, float pressure) {this.temperature = temperature;this.humidity = humidity;display();}public void display() {System.out.println("当前温度:" + temperature + "℃,湿度:" + humidity + "%");}
}

客户端调用

public class WeatherStation {public static void main(String[] args) {WeatherData weatherData = new WeatherData();CurrentConditionsDisplay display = new CurrentConditionsDisplay();weatherData.registerObserver(display);weatherData.setMeasurements(26.5f, 65.0f, 1013.0f);}
}

✅ 优点

  • 降低耦合性,实现松散耦合的通知机制
  • 易于添加新观察者,符合开闭原则

⚠️ 缺点

  • 观察者太多时通知会影响性能
  • 通知链可能较复杂,调试困难

🧩 使用建议

适合构建事件驱动系统、发布订阅模型,也广泛应用于GUI框架、MVC架构中。

相关文章:

23种设计模式-行为型模式之观察者模式(Java版本)

Java 观察者模式&#xff08;Observer Pattern&#xff09;详解 &#x1f9e0; 什么是观察者模式&#xff1f; 观察者模式是一种行为型设计模式&#xff0c;定义对象之间的一种一对多的依赖关系&#xff0c;使得每当一个对象状态发生变化时&#xff0c;所有依赖它的对象都会得…...

从“拼凑”到“构建”:大语言模型系统设计指南!

你有没有试过在没有说明书的情况下组装宜家家具?那种手忙脚乱却又充满期待的感觉,和设计大语言模型(LLM)系统时如出一辙。如果没有一个清晰的计划,很容易陷入混乱。我曾经也一头扎进去,满心期待却又手足无措,被网上那些复杂的架构图搞得晕头转向。于是,我坐下来,把它们…...

云原生--核心组件-容器篇-3-Docker三大核心之--镜像

1、定义与作用 定义&#xff1a; Docker镜像是一个只读的模板&#xff0c;包含运行应用程序所需的所有内容&#xff0c;包括代码、依赖库、环境变量、配置文件等。简单来说&#xff0c;Docker镜像是一个轻量级、独立、可执行的软件包&#xff0c;它包含了运行某个软件所需的所有…...

在QML中获取当前时间、IP和位置(基于网络请求)

目录 引言相关阅读最终效果代码详解1. 基础框架与窗口设置2. IP定位功能实现3. IP获取功能4. 时间更新与应用初始化5. 用户界面布局 总结工程下载 引言 在本文中&#xff0c;我们将探讨如何使用Qt Quick构建一个简单的系统信息显示应用。该应用能够获取当前系统时间、IP地址以…...

Nuxt3中使用UnoCSS指南

Nuxt3中使用UnoCSS指南 UnoCSS是一个高度可定制的、原子化CSS引擎&#xff0c;可以轻松集成到Nuxt3项目中。下面介绍如何在Nuxt3中安装和配置UnoCSS。 安装步骤 安装UnoCSS的Nuxt模块&#xff1a; # 使用pnpm pnpm add -D unocss unocss/nuxt# 使用yarn yarn add -D unocss…...

【计算机网络】TCP的四种拥塞控制算法

TCP&#xff08;传输控制协议&#xff09;是互联网协议套件中用于在网络中两个主机之间提供可靠、有序和错误检测数据传输的协议。TCP使用拥塞控制机制来避免网络拥塞&#xff0c;确保网络资源的有效利用。以下是TCP中常见的四种拥塞控制算法&#xff1a; 慢启动&#xff08;S…...

WebAssembly全栈革命:在Rust与JavaScript之间构建高性能桥梁

一、WASM的全栈渗透图谱 1. 性能临界点的突破 // Rust实现的斐波那契计算 #[wasm_bindgen] pub fn wasm_fib(n: i32) -> i32 {match n {0 > 0,1 > 1,_ > wasm_fib(n-1) wasm_fib(n-2)} }// JavaScript等效实现对比 console.time(js); jsFib(40); // 1024ms cons…...

深度理解linux系统—— 了解操作系统

一、冯诺依曼体系结构 现在我们常见的计算机&#xff08;笔记本电脑等&#xff09;和不常见的计算机&#xff08;服务器&#xff09;它们都满足冯诺依曼体系。 我们可以把计算机理解成一个个硬件组成的 输入设备&#xff1a;键盘、鼠标、摄像头、网卡、磁盘等输出设备&#xf…...

【fork初体验】

文章目录 Linux 实验&#xff1a;深入理解 fork 系统调用一、实验目的二、实验环境三、实验内容与步骤&#xff08;一&#xff09;打印进程的进程 ID 和父进程 ID1. 编写程序2. 编译与运行3. 运行结果 &#xff08;二&#xff09;使用 fork 系统调用创建进程并加入循环语句1. 编…...

区块链VS传统数据库:金融数据存储的“信任”与“效率”博弈

在金融行业数字化转型的浪潮中&#xff0c;数据存储技术选型已成为核心议题。区块链技术凭借其去中心化、不可篡改等特性强势崛起&#xff0c;而传统数据库&#xff08;如关系型数据库MySQL、分布式数据库&#xff09;凭借成熟生态和高效性能仍占据主导地位。如何在两者之间做出…...

Linux渗透测试

Linux渗透测试 比赛题库-Linux渗透测试 文章目录 Linux渗透测试比赛题库-Linux渗透测试 前言一、解题过程1.通过本地PC中渗透测试平台Kali对靶机场景进行系统服务及版本扫描渗透测试&#xff0c;并将该操作显示结果中Apache服务对应的版本信息字符串作为Flag值提交&#xff1b…...

ORA-02069错误排查实录:从 Database Link 到 Global Names 的陷阱

文章目录 错误重现根因解决方案1.设置GLOBAL_NAMEStrue2.全部业务逻辑放在在远端执行 在日常的 Oracle 数据同步任务中&#xff0c;我们经常透过 Database Link&#xff08;DBLink&#xff09; 进行跨数据库查询与写入。某日&#xff0c;我们在执行一段 INSERT INTO … SELECT …...

【CF闯关练习】—— 1200分

&#x1f30f;博客主页&#xff1a;PH_modest的博客主页 &#x1f6a9;当前专栏&#xff1a;cf闯关练习 &#x1f48c;其他专栏&#xff1a; &#x1f534;每日一题 &#x1f7e1; C跬步积累 &#x1f7e2; C语言跬步积累 &#x1f308;座右铭&#xff1a;广积粮&#xff0c;缓…...

正则表达式三剑客之——grep和sed

目录 一.grep 1.1定义 1.2核心功能 1.3基本语法 1.4常用选项 二.sed 2.1 定义 2.2 工作原理 2.3 基本语法 2.3.1常用选项 2.3.2sed自身脚本语法 1. 基本组成 2. 地址 3. 命令 2.3.3 sed替换查找 1 基本语法 2.sed替换查找的实例 3.分组后向引用 4 变量调…...

i18n-ai-translate开源程序,可以使用DeepSeek等模型将您的 i18nJSON翻译成任何语言

一、软件介绍 文末提供程序和源码下载 i18n-ai-translate开源程序使用 DeepSeek等模型可以将您的 i18n JSON 翻译成任何语言。 无缝翻译本地化文件。支持嵌套翻译文件的目录。需要i18next样式的JSON 文件&#xff08;文末一并提供下载&#xff09;。 二、模式 CSV 模式 三个…...

关于Android Studio的Gradle各项配置

Gradle 构建概览 Android 应用通常使用 Gradle 构建系统构建。在深入了解如何配置 build 之前&#xff0c;我们先来探索 build 背后的概念&#xff0c;以便您全面了解系统。 什么是 build&#xff1f; 构建系统会将源代码转换为可执行应用。构建通常涉及多个工具&#xff0c;用…...

数据安全和合规性市场分析

一、什么是数据安全和合规性 在数据安全和合规性方面&#xff0c;存在着一系列重要的法律、法规和行业标准&#xff0c;这些规定了组织如何收集、存储、处理和保护个人数据及其他敏感信息。企业之所以要遵守这些规定&#xff0c;是出于多方面的考量&#xff0c;既有法律责任&a…...

venv环境基础指令以及常见问题汇总(持续更新)

常见指令 在 Python 原生虚拟环境&#xff08;venv&#xff09; 中&#xff0c;没有直接列出所有虚拟环境的命令&#xff08;因为 venv 不像 Conda 那样有集中管理机制&#xff09;&#xff0c;但可以通过 文件操作 或 脚本 实现类似功能。以下是常用命令和技巧&#xff1a; &…...

思科路由器重分发(RIP动态路由+静态路由)

路由器重分发&#xff08;RIP动态路由静态路由&#xff09; 静态路由不能作翻译官 RIP需要宣告自己的ip&#xff1b;还需要帮静态路由也宣告一下开启端口并配置IP地址 RIP路由 Router>en Router#conf t Router(config)#int g0/0 Router(config-if)#no shutdown Router(c…...

产销协同的作用是什么?又如何对各部门发挥作用?

目录 一、产销协同的对象有哪些&#xff1f; 1. 客户需求 2. 市场趋势 3. 供应链伙伴 4. 企业战略目标 二、产销协同的作用是什么&#xff1f; 1. 提高客户满意度 2. 降低企业成本 3. 增强市场竞争力 4. 优化资源配置 三、产销协同对各部门怎么发挥作用&#xff1f;…...

19.【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--单体转微服务--当前项目拆分规划

随着业务规模的不断扩大和系统复杂度的提升&#xff0c;孢子记账系统需要进行微服务架构的转型。本文将详细规划从单体应用向微服务架构迁移的具体方案&#xff0c;包括功能模块分析、服务拆分、技术选型以及实施步骤等内容。通过合理的服务拆分和架构设计&#xff0c;未来我们…...

JFLAP SOFTWARE 编译原理用(自动机绘图)

csdn全是蛆虫&#xff0c;2mb的软件&#xff0c;都在那里搞收费&#xff0c;我就看不惯&#xff0c;我就放出来&#xff0c;那咋了&#xff01;&#xff01;&#xff01; https://pan.baidu.com/s/1IuEfHScynjCCUF5ScF26KA 通过网盘分享的文件&#xff1a;JFLAP7.1.jar 链接: h…...

从 Vue 到 React:React 合成事件

目录 一、什么是 React 合成事件&#xff1f;二、处理流程React 事件系统的大致流程和 Vue 3 的区别 三、用法示例四、SyntheticEvent 的特点五、为什么 React 要统一事件到根节点&#xff1f;1.减少事件监听器数量2. 简化事件解绑逻辑3. 保证一致的行为 六、React 18 后事件系…...

react的fiber 用法

在 React 里&#xff0c;Fiber 是 React 16.x 及后续版本采用的协调算法&#xff0c;它把渲染工作分割成多个小任务&#xff0c;让 React 可以在渲染过程中暂停、恢复和复用任务&#xff0c;以此提升渲染性能与响应能力。在实际开发中&#xff0c;你无需直接操作 Fiber 节点&am…...

深度学习-学习笔记

文章目录 1、概述2、学习笔记2.1、pytorch 的环境配置 1、概述 本篇博客用来记录我学习深度学习的学习笔记 参考视频&#xff1a;PyTorch深度学习快速入门教程 PyTorch 是一个开源的机器学习框架&#xff0c;主要用于构建和训练深度学习模型。 2、学习笔记 2.1、pytorch 的环…...

[创业之路-390]:人力资源 - 社会性生命系统的解构与重构:人的角色嬗变与组织进化论

前言&#xff1a; 人、财、物、信息、机制、流程、制度、方法共同组合了一个持续的消耗资源、持续的价值创造、持续面临生存与发展、遗传与变异的社会性生命系统。 "人"是所有社会性生命系统最最基础性的要素&#xff0c;它弥漫在系统中多维立体空间的不同节点上&am…...

Redis常见面试题——List对象

当然可以&#xff01;这里我帮你整理了一份【Redis中 List 结构】相关的高频面试题&#xff0c;并附上简明回答&#xff1a; &#x1f4da; Redis List 结构面试题&#xff08;高频总结版&#xff09; 1. Redis 中的 List 是什么&#xff1f;底层是什么实现的&#xff1f; 答&…...

案例速成GO操作redis,个人笔记

更多个人笔记&#xff1a;&#xff08;仅供参考&#xff0c;非盈利&#xff09; gitee&#xff1a; https://gitee.com/harryhack/it_note github&#xff1a; https://github.com/ZHLOVEYY/IT_note 安装redis客户端&#xff1a;go get github.com/redis/go-redis/v9 注意go …...

什么是WebSocket?NGINX如何支持WebSocket协议?

大家好&#xff0c;我是锋哥。今天分享关于【什么是WebSocket&#xff1f;NGINX如何支持WebSocket协议&#xff1f;】面试题。希望对大家有帮助&#xff1b; 什么是WebSocket&#xff1f;NGINX如何支持WebSocket协议&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java…...

ssm驾校预约管理系统的设计与实现(源码+lw+部署文档+讲解),源码可白嫖!

摘要 伴随着我国社会的发展&#xff0c;人民生活质量日益提高。在人们出行方式上的体现就是&#xff0c;价格较为昂贵的代步工具——汽车&#xff0c;它的拥有率在我国越来越高了。而汽车的行驶速度很快&#xff0c;并且随着汽车拥有率的增加&#xff0c;城市中行驶和停靠的车…...

babel核心知识点

Babel 是一个 JavaScript 编译器&#xff0c;主要用于将 ECMAScript 2015 版本的代码转换为向后兼容的 JavaScript 代码&#xff0c;以便在旧版本的浏览器或环境中运行。以下是 Babel 的核心知识点&#xff1a; 1. 基本概念 编译器&#xff1a;Babel 本质上是一个编译器&…...

学习笔记(算法学习+Maven)

单调队列优化多重背包 #include <bits/stdc.h> using namespace std; const int M 2010; const int N 20010; int q[N]; int hh 0, tt -1; int f[N]; int g[N]; int v[M], w[M], s[M]; int n, m; int main() { cin >> n >> m; for (int i 1; …...

买币永续合约成全球交易热点,XBIT去中心化交易所平台显著提升市场流动性

在全球加密货币市场日益扩大的背景下&#xff0c;买币永续合约正展现出惊人的增长势头。虽然比特币自2021年黄金时期以来整体兴趣有所减弱&#xff0c;但永续合约市场表现亮眼&#xff0c;专业和机构交易者正从传统日历期货转向这一领域&#xff0c;使得永续合约占据了约66%的未…...

详解 `from datasets import load_dataset`:数据格式、公开数据集与自定义数据集实战指南

在自然语言处理(NLP)和机器学习领域,Hugging Face 的 datasets 库凭借其高效的数据加载和预处理能力成为开发者必备工具。本文通过代码示例详解 load_dataset 的核心用法,涵盖数据格式解析、公开数据集调用和自定义数据集构建。 一、数据格式解析与加载示例 datasets 库支…...

Eclipse 插件开发 1

Eclipse 插件开发 1 1 创建 Eclipse 插件2 特点对比表3 总结对比表 Eclipse 是一个功能强大的集成开发环境(IDE)&#xff0c;最初为 Java 开发设计&#xff0c;但现在已经支持多种语言和平台。它的核心优势在于高度可扩展的插件架构&#xff0c;使开发者能够定制开发环境以满足…...

单链表专题(1)

1.什么是链表&#xff1f; 链表是结构体变量与结构体变量连接在一起 2.动态创建一个链表 动态内存申请模块化设计 1.创建链表&#xff08;创建一个表头表示整个链表&#xff09; 2.创建结点 3.插入结点 4.删除结点 5.打印遍历链表&#xff08;测试&#xff09; 3.创建链…...

[贪心_8] 跳跃游戏 | 单调递增的数字 | 坏了的计算器

目录 1.跳跃游戏 题解 2.单调递增的数字 证明 3.坏了的计算器 题解 解法一&#xff1a;正向推导 解法二&#xff1a;正难则反 1.跳跃游戏 链接&#xff1a; 55. 跳跃游戏 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你…...

Python基于Django的全国二手房可视化分析系统【附源码】

博主介绍&#xff1a;✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&…...

Spring Boot 升级指南(2.x → 3.x)

&#x1f680; Spring Boot 升级指南&#xff08;2.x → 3.x&#xff09; &#x1f522; 1️⃣ 必读文档 &#x1f4d8; 当您需要从 Spring Boot 2.x 升级时&#xff1a; • 官方迁移指南 → https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Migration-…...

基于亚马逊云科技构建音频转文本无服务器应用程序

Amazon Transcribe是一项基于机器学习模型自动将语音转换为文本的服务。它提供了多种可以提高文本转录准确性的功能&#xff0c;例如语言自定义、内容过滤、多通道音频分析和说话人语音分割。Amazon Transcribe 可用作独立的转录服务&#xff0c;也可以集成到应用程序中提供语音…...

io_uring概述:现代 Linux 异步 IO 的新范式

一、引言 在 Linux 系统中&#xff0c;I/O 性能一直是高性能服务器、数据库、存储系统的关键瓶颈。传统的 I/O 接口&#xff08;如 read、write、poll、epoll&#xff09;已经难以满足现代高吞吐低延迟场景的需求。io_uring 的诞生&#xff0c;正是为了解决这些传统 I/O 模型中…...

定制一款国密浏览器(12):分析SM2签名算法的实现

SM2 是一种非对称加密算法,除了用来进行加密解密外,主要作用还用作数字签名。数字签名是私钥签名,公钥用来验签。由于私钥是不公开的,所以私钥签名还可以防抵赖。 一般的签名流程如下: 发送者对消息计算摘要值。发送者用私钥对摘要值进行签名得到签名值。发送者将原始消息…...

SSE协议

目录 SSE协议协议实现传输格式data 字段id 字段event 字段retry 字段 前后端实现使用案例FastAPI SSE-STARLETTE 模拟大模型推理流&#x1f5a5; 代码&#xff1a;FastAPI SSE-STARLETTE 模拟大模型推理流 SSE协议 SSE&#xff0c;全称是 Server-Sent Events&#xff0c;是一…...

精益数据分析(25/126):关键指标驱动业务发展

精益数据分析&#xff08;25/126&#xff09;&#xff1a;关键指标驱动业务发展 在创业和数据分析的道路上&#xff0c;我们都在不断探索如何利用数据实现业务的增长与优化。今天&#xff0c;让我们一起深入学习《精益数据分析》中的关键知识点&#xff0c;通过实际案例来理解…...

基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API

前言 Spring AI Alibaba 开源项目基于 Spring AI 构建&#xff0c;是阿里云通义系列模型及服务在 Java AI 应用开发领域的最佳实践&#xff0c;提供高层次的 AI API 抽象与云原生基础设施集成方案&#xff0c;帮助开发者快速构建 AI 应用。 项目地址 gitcode平台&#xff1a;ht…...

git 工具

Git教程 Git Bash详细教程 Git教程 Git Bash详细教程-CSDN博客 Download – TortoiseGit – Windows Shell Interface to Git...

利用【指针引用】对【非空单循环链表】进行删除操作

【非空单循环链表】是链式存储结构的其中一种&#xff0c;下面是各个词汇的意思&#xff1a; 先说【单】的意思&#xff1a; 这里指的是【单循环】的&#xff0c;另外在别的地方你会碰到一些不一样的循环链表&#xff0c;比如说是【多重链】的。 单循环 【单循环链表】常在表的…...

2025.4.26_STM32_SPI

1.SPI简介 2.硬件电路 所有SPI设备的SCK(时钟)、MOSI(主机输出从机输入)、MISO(主机输入从机输出)分别连在一起。SCK线只能被主机控制&#xff0c;和I2C相同。 主机另外引出多条SS控制线&#xff0c;分别接到各从机的SS引脚 (SS不用的时候为高电平&#xff0c;当主机需要选中某…...

基于OpenMV+STM32+OLED与YOLOv11+PaddleOCR的嵌入式车牌识别系统开发笔记

基于OpenMV、STM32与OLED的嵌入式车牌识别系统开发笔记 基于OpenMV、STM32与OLED的嵌入式车牌识别系统开发笔记系统架构全景 一、实物演示二、OpenMV端设计要点1. 硬件配置优化2. 智能帧率控制算法3. 数据传输协议设计 三、PyTorch后端核心实现&#xff1a;YOLOv11与PaddleOCR的…...

当JIT遇见K8s

目录 一、技术融合背景&#xff1a;从静态架构到动态生态的范式重构 1.1 动态编译技术的三次进化浪潮 1.2 容器编排系统的动态特性解剖 弹性伸缩的数学建模 服务质量&#xff08;QoS&#xff09;的编译场景适配 硬件拓扑感知的编译优化 二、关键技术挑战与突破性解决方案…...