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

监听器模式

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.lqws.cn/news/601723.html

相关文章:

  • [Python] -基础篇8-Python中的注释与代码风格PEP8指南
  • 【C++】inline的作用
  • InnoDB数据页
  • 61、【OS】【Nuttx】【构建】向量表
  • OpenCv基础(C++)
  • 6.Docker部署ES+kibana
  • 无人机目标检测数据集介绍-14,751张图片 无人机检测 航拍图像
  • 路科V0—基础(2)设计特性与接口
  • 【第二章:机器学习与神经网络概述】04.回归算法理论与实践 -(3)决策树回归模型(Decision Tree Regression)
  • 融智学定律3:流动创造价值仅当跨域协同
  • Arduino LED立方体3D公告板制作指南
  • uniapp+vue3 中使用echart 以及echart文件过大需要分包的记录
  • imx6ull芯片中断机制6.24-6.25
  • Redis为什么是单线程
  • UE5.6 官方文档笔记 [1]——虚幻编辑器界面
  • 6.2 实现文档加载和切分和简易向量数据库的功能
  • browser-tools-mcp + excel-mcp-server + cursor 实现读取网页信息自动写入Excel
  • SQL Server 进阶:递归 CTE+CASE WHEN 实现复杂树形统计(第二课)
  • 读Vista
  • Python实例题:基于 Python 的简单爬虫与数据可视化
  • Hibernate中save与saveOrUpdate的差异解析
  • HDMI2.1 FRL流控 概览
  • Linux驱动学习day13(同步与互斥)
  • AI的未来:人类会被取代,还是变得更强大?
  • HTTPS安全传输时采用的顶级阳谋
  • 【Maven 】 <resources> 配置中排除 fonts/** 目录无效,可能是由于以下原因及解决方案:
  • 编写rosbag脚本记录雷达与imu数据包
  • 学习经验分享【41】YOLOv13:基于超图增强自适应视觉感知的实时目标检测
  • day41简单CNN
  • 【Web3.0】Web1.0、Web2.0和Web3.0有哪些区别联系?