Java设计模式之观察者模式:从基础到高级的全面解析

文章目录

    • 一、观察者模式基础概念
      • 1.1 什么是观察者模式?
      • 1.2 观察者模式的四大角色
      • 1.3 观察者模式类图
    • 二、观察者模式实现步骤
      • 2.1 基础实现步骤
      • 2.2 详细代码实现
        • 第一步:定义主题接口
        • 第二步:定义观察者接口
        • 第三步:创建具体主题
        • 第四步:创建具体观察者
        • 第五步:客户端使用
    • 三、观察者模式深入解析
      • 3.1 推模型 vs 拉模型
      • 3.2 Java内置的观察者模式支持
      • 3.3 观察者模式与发布-订阅模式的区别
    • 四、观察者模式高级应用
      • 4.1 观察者模式与Swing事件监听
      • 4.2 使用Lambda表达式简化观察者
      • 4.3 观察者模式与Spring事件机制
    • 五、观察者模式最佳实践与注意事项
      • 5.1 观察者模式最佳实践
      • 5.2 线程安全的观察者模式实现
      • 5.3 观察者模式常见问题及解决方案
    • 六、观察者模式与其他模式的关系
      • 6.1 观察者模式与中介者模式
      • 6.2 观察者模式与责任链模式
      • 6.3 观察者模式与MVC架构
    • 七、实际应用案例:电商价格监控系统
      • 7.1 类设计
      • 7.2 代码实现
      • 7.3 运行结果
    • 八、总结

观察者模式是Java中最常用的行为型设计模式之一,它定义了对象之间的一对多依赖关系,当一个对象改变状态时,所有依赖它的对象都会得到通知并自动更新。本文将带你全面了解观察者模式,从基础概念到高级应用,通过日常生活的例子帮助你深入理解。

一、观察者模式基础概念

1.1 什么是观察者模式?

观察者模式(Observer Pattern)又称为发布-订阅模式(Publish-Subscribe Pattern),它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象状态发生变化时,它会通知所有观察者对象,使它们能够自动更新自己。

生活中的例子:想象你订阅了一份杂志。杂志社(主题)维护了一个订阅者(观察者)列表。当新一期杂志出版时,杂志社会自动将杂志发送给所有订阅者。你不需要每天去书店查看新杂志是否到货,杂志社会在合适的时候通知你。

1.2 观察者模式的四大角色

角色描述对应生活例子
Subject(主题)被观察的对象,维护观察者列表,提供添加/删除观察者的方法杂志社

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/pingmian/82339.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GATT 服务的核心函数bt_gatt_discover的介绍

目录 概述 1 GATT 基本概念 1.1 GATT 的介绍 1.2 GATT 的角色 1.3 核心组件 1.4 客户端操作 2 bt_gatt_discover函数的功能和应用 2.1 函数介绍 2.1 发现类型(Discover Type) 3 典型使用流程 3.1 服务发现示例 3.2 级联发现模式 3.3 按UUID过…

【更新至2023年】1985-2023年全国及各省就业人数数据(无缺失)

1985-2023年全国及各省就业人数数据(无缺失) 1、时间:1985-2023年 2、来源:Z国统计年鉴、各省年鉴、新中国60年 3、指标:就业人数 4、范围:全国及31省 5、缺失情况:无缺失 6、指标解释&am…

0基础学习Linux之揭开朦胧一面:环境基础开发工具

目录 Linux下安装软件的方案: 对于操作系统的理解: 操作系统的生态问题: 什么是好的操作系统(os): 重新理解centos VS ubnutu VS kail: 关于yum: 用 yum 安装软件(安装和卸载软件一定要有r…

YOLO 算法详解:实时目标检测的里程碑

在计算机视觉领域,目标检测一直是一个关键且热门的研究方向,而 YOLO(You Only Look Once)算法凭借其出色的实时性和较高的检测精度,成为了目标检测算法中的明星选手。本文将深入探讨 YOLO 算法的原理、发展历程、技术优…

leetcode98.验证二叉搜索树:递归法中序遍历的递增性验证之道

一、题目深度解析与BST核心性质 题目描述 验证二叉搜索树(BST)是算法中的经典问题,要求判断给定的二叉树是否满足BST的定义: 左子树中所有节点的值严格小于根节点的值右子树中所有节点的值严格大于根节点的值左右子树本身也必须…

MathQ-Verify:数学问题验证的五步流水线,为大模型推理筑牢数据基石

MathQ-Verify:数学问题验证的五步流水线,为大模型推理筑牢数据基石 大语言模型在数学推理领域进展显著,但现有研究多聚焦于生成正确推理路径和答案,却忽视了数学问题本身的有效性。MathQ-Verify,通过五阶段流水线严格…

八股战神-JVM知识速查

1.JVM组成 JVM由那些部分组成,运行流程是什么? JVM是Java程序的运行环境 组成部分: 类加载器:加载字节码文件到内存 运行时数据区:包括方法区,堆,栈,程序计数器,本地…

Maven:在原了解基础上对pom.xml文件进行详细解读

一、pom.xml文件 就像项目管理软件 Make 的 MakeFile、Ant 的 build.xml 一样,Maven 项目的核心是 pom.xml。POM( Project Object Model,项目对象模型 ) 定义了项目的基本信息,用于描述项目如何构建,声明项目依赖,等等…

Spring Cloud项目登录认证从JWT切换到Redis + UUID Token方案

背景介绍 在传统的Spring Boot项目中,用户登录认证常见的方案是使用JWT(JSON Web Token)来实现无状态的身份验证。JWT凭借自包含用户信息、方便前后端分离、性能较好等优势被广泛采用。 然而,在实际项目中,JWT也有一…

MongoDB 快速整合 SpringBoot 示例

1.添加依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spr…

Flyweight(享元)设计模式 软考 享元 和 代理属于结构型设计模式

1.目的&#xff1a;运用共享技术有效地支持大量细粒度的对象 Flyweight&#xff08;享元&#xff09;设计模式 是一种结构型设计模式&#xff0c;它的核心目的是通过共享对象来减少内存消耗&#xff0c;特别是在需要大量相似对象的场景中。Flyweight 模式通过将对象的共享细节与…

002大模型-提示词工程,少样本提示,角色扮演,思维链

一、提示词工程 二、少样本提示 三、角色扮演 四、思维链

华为OD机试真题——传递悄悄话(二叉树最长路径问题)(2025A卷:200分)Java/python/JavaScript/C/C++/GO最佳实现

2025 A卷 200分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…

「读书报告」Spark实时大数据分析

这本书是清华大学出版社2018年出版的&#xff0c;我是2020年读的&#xff0c;说真的的&#xff0c;不怎么喜欢这本书&#xff0c;所以作者我都不想提。有的人可能会奇怪&#xff0c;ailx10&#xff0c;你一个搞网络安全的&#xff0c;怎么会去读大数据相关的书&#xff0c;哎&a…

2025 河北ICPC( D. 金泰园(二分)-- C.年少的誓约(公式转化))

文章目录 2025 河北ICPCD. 金泰园&#xff08;二分&#xff09;C.年少的誓约(公式转化)总结 2025 河北ICPC 题目链接&#xff1a; Attachments - The 9th Hebei Collegiate Programming Contest - Codeforces sdccpc20250522 - Virtual Judge 赛时&#xff1a;5道 D. 金泰…

QT学习一

对于选择qmake还是cmake&#xff0c;现在写的暂时先用qmake 1.命名规范和快捷键 2.按钮控件常用API //创建第一个按钮QPushButton * btn new QPushButton;//让btn对象 依赖在mywidget窗口中btn->setParent(this);//显示文本btn->setText("第一个按钮");//创建…

【Elasticsearch】给所索引创建多个别名

Elasticsearch 是可以给索引创建多个别名的。 为什么可以创建多个别名 1. 灵活性 - 别名可以为索引提供一个更易于理解的名称&#xff0c;方便用户根据不同的业务场景或用途来引用同一个索引。例如&#xff0c;一个索引可能同时服务于多个不同的应用程序或服务&#xff0c;通…

使用 OpenCV 实现哈哈镜效果

在计算机视觉和图像处理领域&#xff0c;OpenCV 提供了非常强大的图像几何变换能力&#xff0c;不仅可以用于纠正图像&#xff0c;还能制造各种“有趣”的视觉效果。今天&#xff0c;我们就来实现一个经典的“哈哈镜”效果&#xff0c;让图像像在游乐园里一样被拉伸、压缩、扭曲…

AI|Java开发 IntelliJ IDEA中接入本地部署的deepseek方法

目录 连接本地部署的deepseek&#xff1a; IntelliJ IDEA中使用deepseek等AI&#xff1a; 用法一&#xff1a;让AI写代码 用法二&#xff1a;选中这段代码&#xff0c;右键&#xff0c;可以让其解释这段代码的含义。这时显示的解释是英文的。 连接本地部署的deepseek&#…

如何使用两块硬盘作为 Ubuntu24 的系统盘,实现坏掉一块不影响系统运行。

最近我想使用Ubuntu组一个NAS系统&#xff0c;想实现系统盘冗余&#xff0c;各位大佬可以给点建议吗。 Deep Seek 为了实现两块硬盘作为 Ubuntu 24 系统盘的冗余配置&#xff08;RAID 1&#xff09;&#xff0c;确保一块硬盘损坏时系统仍可运行&#xff0c;以下是详细步骤&am…