1. 问题背景

假设我们有一个 银行账户管理系统,该系统需要监控用户账户余额的变动,并在发生变动时,自动执行一些相关的操作,比如发送 余额变动通知(如短信、邮件等)。为了实现这一功能,我们希望通过一个灵活且松耦合的方式来处理余额变动通知。

2. 监听器

这个问题当中,当用户的余额发生变化的一瞬间,我们就希望执行发送短信、邮件等功能,在不不知道监听器的时候,你也许会直接在用户余额发生变化的时候把相应的业务逻辑写在那里,这样有好处但是也有坏处,好处就是代码逻辑性强,坏处就是高耦合且不好维护

所以想到余额变化的时候代码那个地方只调用有一个接口,真正执行的时候再把实现注入进去,这个就是监听器

3. 手搓代码环节

3.1 项目结构

3.2 AccountBalanceListener

public interface AccountBalanceListener {void onBalanceChange(double newBalance);  // 余额变化时的响应方法 可以设置发短信或者邮件
}

3.3 BalanceChangeNotifier

public class BalanceChangeNotifier implements AccountBalanceListener{@Overridepublic void onBalanceChange(double newBalance) {// 假设发送一条通知(如发送短信或电子邮件)System.out.println("发送邮件 新的余额是:" + newBalance);}
}

3.4 BankAccount

public class BankAccount {private double balance;  // 账户余额private AccountBalanceListener listener;  // 持有监听器的引用// 构造方法public BankAccount(double balance) {this.balance = balance;}// 设置余额监听器public void setListener(AccountBalanceListener listener) {this.listener = listener;}// 修改余额public void changeBalance(double amount) {this.balance += amount;  // 更新余额if (listener != null) {listener.onBalanceChange(this.balance);  // 触发余额变化事件}}// 获取当前余额public double getBalance() {return balance;}
}

3.5 Main

public class Main {public static void main(String[] args) {// 创建银行账户对象BankAccount account = new BankAccount(1000.0);// 创建余额变动通知器BalanceChangeNotifier notifier = new BalanceChangeNotifier();// 设置账户的余额监听器account.setListener(notifier);// 模拟账户余额变动account.changeBalance(-200.0);account.changeBalance(500.0);}
}

4. 总结

4.1 运行截图

image.png

4.2 一些心得

监听器和观察者有点像,但还是有不同的

  1. 监听器是状态发生变化立刻就执行业务逻辑,观察者则是状态发生变化只是通知各个订阅者,状态发生变化了,业务逻辑还需要他们自己去执行

  2. 监听器往往是1对1,观察者则是1对多 监听器往往用于ui相关,比如按钮的单击事件,观察者更多的是偏向于业务逻辑相关

4.3 A i有话说

image.png

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

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

相关文章

帕鲁杯应急响应赛题:知攻善防实验室

一、背景信息 在这个跳跃的数字舞台上,数据安全成了政企单位稳航的重要压舱石。某政企单位,作为一艘驶向未来 的巨轮,对数据的把控丝毫不敢松懈。眼下,我们即将启航一场无与伦比的探险——“信息安全探索之 旅”。 这趟旅程的目的…

【硬核数学】2.2 深度学习的“微积分引擎”:自动微分与反向传播《从零构建机器学习、深度学习到LLM的数学认知》

欢迎来到本系列的第七篇文章。在上一章,我们用张量武装了我们的线性代数知识,学会了如何描述和操作神经网络中的高维数据流。我们知道,一个神经网络的“前向传播”过程,就是输入张量经过一系列复杂的张量运算(矩阵乘法…

DAY 45 Tensorboard使用介绍

浙大疏锦行https://blog.csdn.net/weixin_45655710知识点回顾: tensorboard的发展历史和原理tensorboard的常见操作tensorboard在cifar上的实战:MLP和CNN模型 作业:对resnet18在cifar10上采用微调策略下,用tensorboard监控训练过程…

2023年全国硕士研究生招生考试英语(一)试题总结

文章目录 题型与分值分布完形填空错误 1:考察连词 or 前后内容之间的逻辑关系错误2:错误3:错误4:这个错得最有价值,因为压根没读懂错误5:学到的短语: 仔细阅读排序/新题型翻译小作文大作文 题型…

react-数据Mock实现——json-server

什么是mock? 在前后端分离的开发模式下,前端可以在没有实际后端接口的支持下先进行接口数据的模拟,进行正常的业务功能开发 json-server实现数据Mock json-server是一个node的包,可以在不到30秒内获得零编码的完整Mock服务 实现…

使用POI导入解析excel文件

首先校验 /*** 校验导入文件* param file 上传的文件* return 校验结果,成功返回包含成功状态的AjaxResult,失败返回包含错误信息的AjaxResult*/private AjaxResult validateImportFile(MultipartFile file) {if (file.isEmpty()) {return AjaxResult.er…

从0开始学习计算机视觉--Day06--反向传播算法

尽管解析梯度可以让我们省去巨大的计算量,但如果函数比较复杂,对这个损失函数进行微分计算会变得很困难。我们通常会用反向传播技术来递归地调用链式法则来计算向量每一个方向上的梯度。具体来说,我们将整个计算过程的输入与输入具体化&#…

企业流程知识:《学习观察:通过价值流图创造价值、消除浪费》读书笔记

《学习观察:通过价值流图创造价值、消除浪费》读书笔记 作者:迈克鲁斯(Mike Rother),约翰舒克(John Shook) 出版时间:1999年 历史地位:精益生产可视化工具的黄金标准&am…

Day02_C语言IO进程线程

01.思维导图 02.将当前的时间写入到time. txt的文件中,如果ctrlc退出之后,在再次执行支持断点续写 1.2022-04-26 19:10:20 2.2022-04-26 19:10:21 3.2022-04-26 19:10:22 //按下ctrlc停止,再次执行程序 4.2022-04-26 20:00:00 5.2022-04-26 2…

FFmpeg中TS与MP4格式的extradata差异详解

在视频处理中,extradata是存储解码器初始化参数的核心元数据,直接影响视频能否正确解码。本文深入解析TS和MP4格式中extradata的结构差异、存储逻辑及FFmpeg处理方案。 📌 一、extradata的核心作用 extradata是解码必需的参数集合&#xff0…

【CV数据集介绍-40】Cityscapes 数据集:助力自动驾驶的语义分割神器

🧑 博主简介:曾任某智慧城市类企业算法总监,目前在美国市场的物流公司从事高级算法工程师一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…

SAP月结问题9-FAGLL03H与损益表中研发费用金额不一致(FAGLL03H Bug)

SAP月结问题9-FAGLL03H与损益表中研发费用金额不一致(S4 1709) 财务反馈,月结后核对数据时发现FAGLL03H导出的研发费用与损益表中的研发费用不一致,如下图所示: 对比FAGLL03H与损益表对应的明细,发现FAGLL03H与损益表数据存在倍数…

HTML inputmode 属性详解

inputmode 是一个 HTML 属性&#xff0c;用于指定用户在编辑元素或其内容时应使用的虚拟键盘布局类型。它主要影响移动设备和平板电脑的输入体验。 语法 <input inputmode"value"> <!-- 或 --> <textarea inputmode"value"></texta…

软考中级【网络工程师】第6版教材 第1章 计算机网络概述

考点分析&#xff1a; 本章重要程度&#xff1a;一般&#xff0c;为后续章节做铺垫&#xff0c;有总体认识即可&#xff0c;选择题1-2分高频考点&#xff1a;OSI模型、TCP/IP模型、每个层次的功能、协议层次新教材变化&#xff1a;删除网络结构、删除X.25、更新互联网发展【基本…

Mysql事务与锁

数据库并发事务 数据库一般都会并发执行多个事务&#xff0c;多个事务可能会并发的对相同的一批数据进行增删改查操作&#xff0c;可能就会导致我们说的脏写、脏读、不可重复读、幻读这些问题。为了解决这些并发事务的问题&#xff0c;数据库设计了事务隔离机制、锁机制、MVCC多…

Bilibili多语言字幕翻译扩展:基于上下文的实时翻译方案设计

Bilibili多语言字幕翻译扩展&#xff1a;基于上下文的实时翻译方案设计 本文介绍了一个Chrome扩展的设计与实现&#xff0c;该扩展可以为Bilibili视频提供实时多语言字幕翻译功能。重点讨论了字幕翻译中的上下文问题及其解决方案。 该项目已经登陆Chrome Extension Store: http…

热血三国野地名将列表

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>野地名将信息表</title><style>tabl…

【记录】Word|Word创建自动编号的多级列表标题样式

文章目录 前言创建方式第一种方法&#xff1a;从“定义多级列表”中直接绑定已有样式第二种方法&#xff1a;通过已有段落创建样式&#xff0c;再绑定补充说明 尾声 前言 这世上荒唐的事情不少&#xff0c;但若说到吊诡&#xff0c;Word中的多级列表样式设定&#xff0c;倒是能…

使用mavros启动多机SITL仿真

使用mavros启动多机SITL仿真 方式1&#xff1a;使用roslaunch一键启动Step1&#xff1a;创建一个新的 ROS 包或放到现有包里Step2&#xff1a;编辑 multi_mavros.launchStep3&#xff1a;构建工作空间并 source 环境Step4&#xff1a;构建工作空间并 source 环境 方式2&#xf…

Flutter 网络栈入门,Dio 与 Retrofit 全面指南

面向多年 iOS 开发者的零阻力上手 写在前面 你在 iOS 项目中也许习惯了 URLSession、Alamofire 或 Moya。 换到 Flutter 后&#xff0c;等价的「组合拳」就是 Dio Retrofit。 本文将带你一次吃透两套库的安装、核心 API、进阶技巧与最佳实践。 1. Dio&#xff1a;Flutter 里的…