设计模式-观察者模式(代码实现、源码级别应用、使用场景)
提示:观察者模式的代码实现、观察者模式的使用场景、观察者模式源码级别的应用、观察者模式的优点、
文章目录
- 前言
- 一、定义
- 二、类图
- 三、代码实现
- 四、应用场景
- 五、源码级别的应用
- 总结
前言
随着时间的推移,我现在越来越感觉自己的代码不够优雅了,相信有一部分博友跟我有同样的困扰,因此决定再学习记录一下相关的设计模式。今天就介绍一下设计模式-观察者模式
一、定义
模式定义:定义了对象之间的一对多依赖,让多个观察者对象同时监听某一个主题对象,当主题对象发生变化时,他的所有依赖者都会收到通知并更新。
二、类图
- 其中subject 代表着主题对象。subject中的attach代表着添加观察者的方法(需要观察这个对象的时候加进来,不需要的时候移除)、detach代表着删除观察者的方法(不感兴趣的时候可以移除这个观察者)、notify代表着观察着发生变化的方法。
- observer代表着观察着对象。他的update方法,就是主题对象改变了以后,观察者对象要改变的方法
三、代码实现
代码如下:
package com.zheng.observer;import java.util.ArrayList;
import java.util.List;/*** @author: ztl* @date: 2024/09/19 22:20* @desc: 观察着模式,测试类*/
public class ObserverTest {public static void main(String[] args) {MySuject subject = new MySuject();TaskAObserver taskAObserver = new TaskAObserver();TaskBObserver taskBObserver = new TaskBObserver();subject.addObserver(taskAObserver);subject.addObserver(taskBObserver);// subject.notifyObserver("被观察的对象发生了改变"); // TaskAObserver start TaskBObserver startsubject.removeObserver(taskBObserver);// 把B的task从监听的中去掉了,所以只有a继续观察了subject.notifyObserver("被观察的对象发生了改变"); // TaskAObserver start}
}/*** 定义一个类,这个就是被观察的对象*/
class MySuject{// 容器(也就是所有观察这个对象的观察者)private List<MyObserver> list = new ArrayList<>();// addpublic void addObserver(MyObserver myObserver){list.add(myObserver);}// removepublic void removeObserver(MyObserver myObserver){list.remove(myObserver);}// 具体的改变方法,就是被观察的对象发生改变的方法,public void notifyObserver(Object object){for (MyObserver myObserver : list){myObserver.update();}}
}/*** 观察者模式的接口,他下面可以有多少实现*/
interface MyObserver{void update();
}/*** 观察者的第一个实现类*/
class TaskAObserver implements MyObserver{@Overridepublic void update() {System.out.println("TaskAObserver start");}
}/*** 观察者的第二个实现类*/
class TaskBObserver implements MyObserver{@Overridepublic void update() {System.out.println("TaskBObserver start");}
}
四、应用场景
当更改一个对象的状态可能需要更改其他对象,并且实际的对象集事先未知或动态更改时,倾使用观察者模式
优点:
1.符合开闭原则
2.可以在运行时简历对象之间的关系
五、源码级别的应用
JDK中:
java util.Observable;Spring中:
org.springframework.context.ApplicationListener
总结
今天跟媳妇儿聊天的时候,就随口一提:现在看spring源码看的我瞌睡,昏昏沉沉的。媳妇儿问我,那你之前不困吗?我答:不,我之前不看源码(手动狗头)
相关文章:

设计模式-观察者模式(代码实现、源码级别应用、使用场景)
提示:观察者模式的代码实现、观察者模式的使用场景、观察者模式源码级别的应用、观察者模式的优点、 文章目录 前言一、定义二、类图三、代码实现四、应用场景五、源码级别的应用总结 前言 随着时间的推移,我现在越来越感觉自己的代码不够优雅了&#x…...
9种 Vuejs 常用事件修饰符与使用指南
前言 事件修饰符是 Vue.js 中一种特殊的语法标记,通过在事件名称后加上 . 和修饰符名称,可以轻松地修改事件的默认行为。这些修饰符不仅能够提升代码的清晰度,还能够避免一些常见的编程陷阱。Vue.js 提供了一系列事件修饰符,帮助…...

第十四题刮开有奖
这道题还是将我们下载好的附件先查壳 发现无壳且为32位 所以我们用32位的IDA打开 打开后ShftF12发现一串可疑的字符串 我们跟进看看 发现了这个函数 看这里有string数组 首先给了一串七v7 v8v9的数据 下面还有一个函数 我们再跟进一下 发现这大概是前面v7那堆数据的加密方式 我…...

vue3+vite使用dataV后项目运行报错、页面空白问题
Vue 大屏数据展示组件库官网:http://datav.jiaminghi.com/guide/ 我的版本是:“jiaminghi/data-view”: “^2.10.0” 一、dataV引入,看官网也可 // 安装 ( 我的安装版本 "jiaminghi/data-view": "^2.10.0" …...

PDF 【人工智能白皮书 】【大模型安全实践白皮书】【大模型白皮书】【大模型/深度学习/人工智能原理/心智学习】
【2024 中国人工智能发展白皮书 】【2023 中国人工智能白皮书】【大模型/深度学习/人工智能原理/心智学习】 前言下面所有涉及到的白皮书文件的总下载链接(网盘): 2024 人工智能发展白皮书 深圳市易行网数字科技有限公司2024 大模型训练数据白…...
【vue】13.深入理解递归组件
在Vue.js的开发实践中,组件是构建界面的核心概念。而递归组件则是一种特殊的组件,它能够自己调用自己,从而创造出无限嵌套的界面结构。本文将带你了解递归组件的应用,以及如何在Vue中实现和使用它。 一.什么是递归组件?…...
【OFDM】OFDM Radar Algorithms in Mobile Communication Networks
[1] Maximum Likelihood Speed and Distance Estimation for OFDM Radar 1-CRB估计 1-初步形式 首先单频信号频率估计的CRB,也就是原文Eq.(3.53) v a r [ ω ^ ] ≥ 6 σ N 2 ( N 2 − 1 ) N \mathrm{var}[\hat{\omega}]\geq\frac{6\sigma_N^2}{(N^2-1)N} var[ω^]≥(N2−…...
如何检测java中的内存泄露及溢出,并预防?
引言 在Java开发中,内存管理是一个至关重要的方面。尽管Java有垃圾回收机制,但开发者仍然需要关注内存泄漏和溢出的问题。 内存泄漏会导致应用程序的性能下降,甚至崩溃,而内存溢出则会导致Java虚拟机(JVM)抛出OutOfMemoryError异常。 本文将探讨如何检测Java项目中的内…...

kafka 如何减少数据丢失?
大家好,我是锋哥。今天分享关于【kafka 如何减少数据丢失?】面试题?希望对大家有帮助; kafka 如何减少数据丢失? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Apache Kafka 是一个高吞吐量的分布式消息队列,广泛用…...
CTF-PWN: 虚表(vtable)
vtable vtable(虚表,virtual table)是面向对象编程中的一个关键概念,主要用于实现多态性(polymorphism)。它是一种数据结构,通常是一个指针数组,包含了类的虚函数(virtu…...

Redis 集群 总结
前言 相关系列 《Redis & 目录》(持续更新)《Redis & 集群 & 源码》(学习过程/多有漏误/仅作参考/不再更新)《Redis & 集群 & 总结》(学习总结/最新最准/持续更新)《Redis & 集群…...

2024校园交友系统构建指南/保姆版教程与技巧uniapp+php支持二开
一、建构技巧 1.前后端分离:采用前后端分离的开发模式,有助于提升开发效率,降低维护成本。前端专注于用户界面和交互体验,后端专注于业务逻辑和数据处理。 2.数据安全与隐私保护:实现细粒度的用户权限控制,确保用户数…...

NVR设备ONVIF接入平台EasyCVR视频分析设备平台视频质量诊断技术与能力
视频诊断技术是一种智能化的视频故障分析与预警系统,NVR设备ONVIF接入平台EasyCVR通过对前端设备传回的码流进行解码以及图像质量评估,对视频图像中存在的质量问题进行智能分析、判断和预警。这项技术在安防监控领域尤为重要,因为它能够确保监…...

系统思考—啤酒游戏经营决策沙盘
《第五项修炼:学习型组织建立》——系统思考的深层实践 越来越多的客户发现,系统思考不仅仅是一门课程,而是一种长期的实践。感谢合作伙伴对《第五项修炼》的支持,将其作为一个整体项目推荐。广东嘉荣超市在8月结束两天系统思考的…...

组件封装思路
组件封装的核心思路是:把可复用的结构只写一次,把可能发生变化的部分抽象成组件参数(props/插槽)。 如果是像纯文本,像是一些主标题和副标题,可以抽象成prop传入 如果主体内容是复杂的模版,有图片有列表等,…...

akshare股票涨跌停获取统计分析
参看: https://akshare.akfamily.xyz/data/stock/stock.html#id375 数据源来自东方财富网:https://quote.eastmoney.com/ztb/detail#typeztgc 参数说明 涨停统计: n/m代表m天中有n次涨停板 安装: pip install akshare -i http…...

前端对一个增删改查的思考
1、来源:dify dify/web/app/components/workflow/nodes/question-classifier/components/class-list.tsx at main langgenius/dify GitHub 2、代码流程: 3、思索问题: 1、为啥要用return形式,而不是value直接当函数࿱…...

【Clickhouse】客户端连接工具配置
ClickHouse 是什么 ClickHouse 是一个分布式实时分析型列式存储数据库。具备高性能,支撑PB级数据,提供实时分析,稳定可扩展等特性。适用于数据仓库、BI报表、监控系统、互联网用户行为分析、广告投放业务以及工业、物联网等分析和时序应用场…...

【测试平台】打包 jenkins配置和jenkinsfile文件
背景: 当打包机环境配置完成后,需要挂到master的jenkins中,完成调度。 jenkins启动 命令行直接启动即可。 nohup java -jar /usr/local/opt/jenkins/libexec/jenkins.war --httpListenAddress0.0.0.0 --httpPort80 appending output to n…...

Leetcode224 -- 基本计算器及其拓展
题目分析: 其实这个计算器的实现并不难,因为除了括号就剩下加减法嘛,括号肯定比加减法先执行,但是加减法是同级的,只是会改变数字的正负号而已,所以实现的逻辑并不是很难,我们只需要一个栈&…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...

windows系统MySQL安装文档
概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...

如何在Windows本机安装Python并确保与Python.NET兼容
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...

C++--string的模拟实现
一,引言 string的模拟实现是只对string对象中给的主要功能经行模拟实现,其目的是加强对string的底层了解,以便于在以后的学习或者工作中更加熟练的使用string。本文中的代码仅供参考并不唯一。 二,默认成员函数 string主要有三个成员变量,…...

Java设计模式:责任链模式
一、什么是责任链模式? 责任链模式(Chain of Responsibility Pattern) 是一种 行为型设计模式,它通过将请求沿着一条处理链传递,直到某个对象处理它为止。这种模式的核心思想是 解耦请求的发送者和接收者,…...

VASP软件在第一性原理计算中的应用-测试GO
VASP软件在第一性原理计算中的应用 VASP是由维也纳大学Hafner小组开发的一款功能强大的第一性原理计算软件,广泛应用于材料科学、凝聚态物理、化学和纳米技术等领域。 VASP的核心功能与应用 1. 电子结构计算 VASP最突出的功能是进行高精度的电子结构计算ÿ…...
Spring Boot 与 Kafka 的深度集成实践(二)
3. 生产者实现 3.1 生产者配置 在 Spring Boot 项目中,配置 Kafka 生产者主要是配置生产者工厂(ProducerFactory)和 KafkaTemplate 。生产者工厂负责创建 Kafka 生产者实例,而 KafkaTemplate 则是用于发送消息的核心组件&#x…...
scan_mode设计原则
scan_mode设计原则 在进行mtp controller设计时,基本功能设计完成后,需要设计scan_mode设计。 1、在进行scan_mode设计时,需要保证mtp处于standby模式,不会有擦写、编程动作。 2、只需要固定mtp datasheet说明的接口即可…...