行为设计模式 -责任链模式- JAVA

责任链设计模式

    • 一 .简介
    • 二. 案例
      • 2.1 抽象处理者(Handler)角色
      • 2.2 具体处理者(ConcreteHandler)角色
      • 2.3 测试
    • 三. 结论
      • 3.1 优缺点
      • 3.2 示例
      • 3.3 要点

前言
这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。

作者:神的孩子都在歌唱

一 .简介

百度百科:责任链模式是一种行为设计模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织分配责任。

个人理解: 通过责任链方式可以找到能够处理客户端请求的对象。感觉就跟Switch 或者try-catch 一样,当前不匹配就继续往下匹配。

责任链模式涉及到的角色如下所示:

● **抽象处理者(Handler)角色:**定义出一个处理请求的接口。如果需要,接口可以定义 出一个方法以设定和返回对下家的引用。这个角色通常由一个Java抽象类或者Java接口实现。Handler类的聚合关系给出了具体子类对下家的引用,抽象方法handleRequest()规范了子类处理请求的操作。

● **具体处理者(ConcreteHandler)角色:**具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。

二. 案例

网上看了很多案例,感觉ATM取款机这个案例最容易理解。需求是让用户输入一个金额数(amount),然后ATM机会将输入的金额数从大到小(能够分配的纸币类型是100元 20 元 10元)进行分配。如果用户输入的金额不是10的倍数,就抛出错误。

image-20240604171326864

其实这个实现起来很简单,不过为了将每种类型的纸币进行解耦,所以需要使用责任链方式去解决

2.1 抽象处理者(Handler)角色

定义分配的处理链接口

/*** @author chenyunzhi* @date 2024/6/4 16:27* @Description 分配的处理链接口*/
public interface DispenseChain {/*** 要执行的下一个链(对象)*/void setNextChain(DispenseChain nextChain);/*** 执行分配的方法*/void dispense(Integer amount);
}

2.2 具体处理者(ConcreteHandler)角色

定义每种纸币的对象

Yuan100Dispenser

/*** @author chenyunzhi* @date 2024/6/4 16:30* @Description*/
public class Yuan100Dispenser implements DispenseChain{private DispenseChain dispenseChain;@Overridepublic void setNextChain(DispenseChain nextChain) {this.dispenseChain = nextChain;}@Overridepublic void dispense(Integer amount) {if (amount >= 100) {int num = amount / 100;int remainder = amount % 100;System.out.println("分配了" + num + "张100元");// 进入下一个分配if (remainder != 0) {this.dispenseChain.dispense(remainder);}} else {this.dispenseChain.dispense(amount);}}
}

Yuan20Dispenser

/*** @author chenyunzhi* @date 2024/6/4 16:30* @Description*/
public class Yuan20Dispenser implements DispenseChain{private DispenseChain dispenseChain;@Overridepublic void setNextChain(DispenseChain nextChain) {this.dispenseChain = nextChain;}@Overridepublic void dispense(Integer amount) {if (amount >= 20) {int num = amount / 20;int remainder = amount % 20;System.out.println("分配了" + num + "张20元");// 进入下一个分配if (remainder != 0) {this.dispenseChain.dispense(remainder);}} else {this.dispenseChain.dispense(amount);}}
}

Yuan10Dispenser

/*** @author chenyunzhi* @date 2024/6/4 16:30* @Description*/
public class Yuan10Dispenser implements DispenseChain{private DispenseChain dispenseChain;@Overridepublic void setNextChain(DispenseChain nextChain) {this.dispenseChain = nextChain;}@Overridepublic void dispense(Integer amount) {if (amount >= 10) {int num = amount / 10;int remainder = amount % 10;System.out.println("分配了" + num + "张10元");// 进入下一个分配if (remainder != 0) {this.dispenseChain.dispense(remainder);}} else {this.dispenseChain.dispense(amount);}}
}

2.3 测试

这一步我们将三种纸币连接起来,创建链进行测试

/*** @author chenyunzhi* @date 2024/6/4 16:48* @Description 测试*/
public class ChainOfResponsibilityPatternTest {private DispenseChain chain;/*** 初始化atm分配链*/public  ChainOfResponsibilityPatternTest() {this.chain = new Yuan100Dispenser();Yuan20Dispenser yuan20Dispenser = new Yuan20Dispenser();Yuan10Dispenser yuan10Dispenser = new Yuan10Dispenser();chain.setNextChain(yuan20Dispenser);yuan20Dispenser.setNextChain(yuan10Dispenser);}public static void main(String[] args) {ChainOfResponsibilityPatternTest patternTest = new ChainOfResponsibilityPatternTest();for (int i=0; i<3; i++){System.out.println("----------输入领取金额-----------");Scanner scanner = new Scanner(System.in);int amount = scanner.nextInt();if (amount % 10 != 0) {System.out.println("需要输入10的倍数的金额");continue;}patternTest.chain.dispense(amount);System.out.println("----------分配结束-----------");}}}

image-20240604171106716

通过上面的组装链,就能够将atm的需求实现了。

三. 结论

3.1 优缺点

1,优点:

  • 降低了对象之间的耦合度: 该模式降低了请求发送者和接收者的耦合度。

  • 增强了系统的可扩展性:可以根据需要增加新的请求处理类,满足开闭原则。

  • 增强了给对象指派职责的灵活性:当工作流程发生变化,可以动态地改变链内的成员或者修改它们的次序,也可动态地新增或者删除责任。

  • 责任链简化了对象之间的连接:一个对象只需保持一个指向其后继者的引用,不需保持其他所有处理者的引用,这避免了使用众多的 if 或者 if···else 语句。

  • 责任分担:每个类只需要处理自己该处理的工作,不能处理的传递给下一个对象完成,明确各类的责任范围,符合类的单一职责原则。

2,缺点:

  • 不能保证每个请求一定被处理。由于一个请求没有明确的接收者,所以不能保证它一定会被处理,该请求可能一直传到链的末端都得不到处理。
  • 对比较长的职责链,请求的处理可能涉及多个处理对象,系统性能将受到一定影响。
  • 职责链建立的合理性要靠客户端来保证,增加了客户端的复杂性,可能会由于职责链的错误设置而导致系统出错,如可能会造成循环调用。

3.2 示例

  • java.util.logging.Logger#log()
  • javax.servlet.Filter#doFilter()

3.3 要点

  1. 责任链设计模式可以很好地实现失去耦合,但如果大多数代码在所有实现中都是通用的,那么它会带来大量实现类和维护问题的权衡。
  2. 客户端不知道链的哪一部分将处理请求,它会将请求发送到链中的第一个对象

作者:神的孩子都在歌唱

本人博客:https://blog.csdn.net/weixin_46654114

转载说明:务必注明来源,附带本人博客连接。

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

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

相关文章

智能优化算法-狐狸优化算法(FOX)(附源码)

目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1.内容介绍 狐狸优化算法 (Fox Optimization Algorithm, FOX) 是一种基于群体智能的元启发式优化算法&#xff0c;它模拟了狐狸的捕食行为、社会互动和环境适应能力&#xff0c;用于解决复杂的优化问题。 FOX的工作机制主要…

MR20一体式远程IO模块:引领工业自动化的创新之选

在快速发展的工业自动化领域&#xff0c;高效、可靠且易于维护的IO模块成为了众多企业的首选。其中&#xff0c;MR20系列一体式远程IO模块凭借其卓越的性能和人性化的设计&#xff0c;在众多IO模块中脱颖而出&#xff0c;成为工业自动化领域的璀璨明星。 小巧体积&#xff0c;高…

【CSS3】css开篇基础(4)

1.❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; Hello, Hello~ 亲爱的朋友们&#x1f44b;&#x1f44b;&#xff0c;这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章&#xff0c;请别吝啬你的点赞❤️❤️和收藏&#x1f4d6;&#x1f4d6;。如果你对我的…

[免费]SpringBoot+Vue智慧校园(校园管理)系统[论文+源码+SQL脚本]

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringBootVue智慧校园(校园管理)系统&#xff0c;分享下哈。 项目视频演示 【免费】SpringBootVue智慧校园(校园管理)系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 随着信息技术的迅猛发展&#xff0c…

3DS MAX三维建模平面基础与修改工具(图形编辑与二维建模修改工具)

又是一年1024祝大家程序员节日快乐 3DS MAX三维建模平面基础与修改工具&#xff08;图形编辑与二维建模修改工具&#xff09; 欢迎大家来学习3DS MAX教程&#xff0c;在这里先说一下研究好3ds Max一定要一边看教程一边要自己学的操作才能更快的进步&#xff0c;预祝大家学习顺利…

Linux 进程间通信_匿名管道

1.程间通信目的 : 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程 资源共享&#xff1a;多个进程之间共享同样的资源。 通知事件&#xff1a;一个进程需要向另一个或一组进程发送消息&#xff0c;通知它&#xff08;它们&#xff09;发生了某种事件&#xff08;如…

家庭网络光猫到客厅通过VLAN实现单线复用

大部分家庭装修时没有提前考虑网线分布&#xff0c;一般装修公司都是从各个房间拉一根网线到弱电箱&#xff0c;就结束了&#xff0c;如下图。但是弱电箱在大部分家庭&#xff0c;空间非常小&#xff0c;很难放下一些常见的路由器&#xff0c;花大价钱买了个路由器作为主路由&a…

【C++】继承与模板

继承 1.继承的概念 概念&#xff1a;继承(inheritace)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特性的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称之为派生类。继承呈现了面向对象程序设计的…

信息安全工程师(68)可信计算技术与应用

前言 可信计算技术是一种计算机安全体系结构&#xff0c;旨在提高计算机系统在面临各种攻击和威胁时的安全性和保密性。 一、可信计算技术的定义与原理 可信计算技术通过包括硬件加密、受限访问以及计算机系统本身的完整性验证等技术手段&#xff0c;确保计算机系统在各种攻击和…

融合DevOps打造企业高效流程体系的实践与探索

一、引言 转眼间&#xff0c;我已毕业十多年&#xff0c;在IT领域深耕不辍&#xff0c;曾涉足全栈研发、大数据研发、架构设计与项目管理等多个岗位&#xff0c;更主导过公司从市场到交付再到运营的全链条流程建设。在这漫长的职业生涯中&#xff0c;一个问题始终萦绕在我心头&…

Linux安装部署数据库:PostgreSQL14

Linux安装部署数据库&#xff1a;PostgreSQL14 一、安装环境1、虚拟机环境2、下载安装包 二、安装步骤1、在线安装 PGSQL2、离线安装 PGSQL3、源码安装 PGSQL 三、基本操作1、初始化配置2、数据库登录3、常用命令项 四、常见问题1、对用户 "postgres" 的对等认证失败…

App测试环境部署

一.JDK安装 参考以下AndroidDevTools - Android开发工具 Android SDK下载 Android Studio下载 Gradle下载 SDK Tools下载 二.SDK安装 安装地址&#xff1a;https://www.androiddevtools.cn/ 解压 环境变量配置 变量名&#xff1a;ANDROID_SDK_HOME 参考步骤&#xff1a; A…

3GPP协议解读_NTN系列(一)_38.811_非地面网络(NTN)的背景、应用场景和信道建模

非地面网络 1. Scope4. 非地面网络背景介绍4.1 5G中的非地面网络4.2 非地面网络在5G中的用例4.3 卫星和空中接入网的架构4.4 卫星和空中接入网终端的特点4.5 空气/星载飞行器特性4.6 NTN的覆盖模式4.7 NTN网络架构选项4.8 频谱 5. 非地面网络应用场景5.1 应用场景概览5.2 属性介…

CHAPTER 14 Nonlinearity and Mismatc

CHAPTER 14 Nonlinearity and Mismatch 第6,7章我们介绍了两种非理想: 频率响应和噪声. 这一章我们介绍另外两种非理想现象: 非线性和失配. 我们首先定量化nonlinearity, 学习差分电路和反馈系统的非线性, 以及线性化技术. 然后学习差分电路中的失配和dc offset. 最后学习一些…

51单片机之蜂鸣器驱动

1.简介 蜂鸣器是一种一体化结构的电子讯响器&#xff0c;采用直流电压供电&#xff0c;广泛应用于计算机、打印机、 复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。   压电式蜂鸣器主要…

【C++】vector<string>-动态数组存储多个string

#1024程序员节 | 征文# //demo #include <iostream> #include <vector> #include <string>using namespace std; int main() {// 创建一个存储字符串的向量vector<string> Record;// 向向量中添加字符串Record.push_back("example");Record…

Node-RED的面板的认识及操作

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 &#x1f4d8; 文章引言 &#x1f4df; 面板…

深入探索:深度学习在时间序列预测中的强大应用与实现

引言&#xff1a; 时间序列分析是数据科学和机器学习中一个重要的研究领域&#xff0c;广泛应用于金融市场、天气预报、能源管理、交通预测、健康监控等多个领域。时间序列数据具有顺序相关性&#xff0c;通常展示出时间上较强的依赖性&#xff0c;因此简单的传统回归模型往往…

论文略读:Less is More: on the Over-Globalizing Problem in Graph Transformers

2024 ICML 主要观点&#xff1a;Graph Transformer 中的过全局化问题 (Over-Globalizing Problem) 当前 Graph Transformer 的注意力机制过度关注那些远端节点&#xff0c;而实际上包含了大部分有用信息的近端节点则被相对忽视了——>提出了一种新的采用协同训练的两级全局…

【Ubuntu】服务器系统重装SSHxrdpcuda

本文作者&#xff1a; slience_me Ubuntu系统重装操作合集 文章目录 Ubuntu系统重装操作合集1.1 系统安装&#xff1a;1.2 安装openssh-server更新系统包安装OpenSSH服务器检查SSH服务的状态配置防火墙以允许SSH测试SSH连接配置SSH&#xff08;可选&#xff09; 1.3 安装远程连…