【玩转23种Java设计模式】行为型模式篇:责任链模式
软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。
汇总目录链接:【玩转23种Java设计模式】学习目录汇总整理
文章目录
- 一、简介
- 二、实例
- 1、请假类(LeaveRequest)
- 2、处理器接口(LeaveRequestHandler)
- 3、经理处理器(Manager)
- 4、总监处理器(Commissioner)
- 5、CTO处理器(CTO)
- 6、客户端(Client)
- 三、总结
- 1、优点
- 2、缺点
- 3、应用场景
一、简介
责任链模式(Chain of Responsibility),一种行为型设计模式,它为请求创建了一个接收者对象的链。这种模式给予了请求的处理更多的灵活性,可以动态地决定请求由哪个对象来处理。实际上,每个接收者对象都包含对另一个接收者对象的引用,如果当前对象无法处理请求,它会将请求传递给下一个接收者对象。
主要角色:
- 抽象处理器(Handler):处理器接口定义了处理请求的方法,通常会有一个处理请求的方法和设置下一个处理器的方法。
- 具体处理器(ConcreteHandler):具体处理器实现处理器接口,处理请求或将请求传递给链上的下一个处理器。
- 客户端(Client):客户端负责构建处理器链,并向链上的第一个处理器发送请求。
二、实例
例如:员工请假,请假2天内,经理审批;超过2天,不大于5天,总监审批;超过5天,CTO审批。
1、请假类(LeaveRequest)
public class LeaveRequest {private int days;public LeaveRequest(int days) {this.days = days;}public int getDays() {return days;}
}
2、处理器接口(LeaveRequestHandler)
public interface LeaveRequestHandler {void setNextHandler(LeaveRequestHandler nextHandler);void handleRequest(LeaveRequest request);
}
3、经理处理器(Manager)
@Slf4j
public class Manager implements LeaveRequestHandler {private LeaveRequestHandler nextHandler;@Overridepublic void setNextHandler(LeaveRequestHandler nextHandler) {this.nextHandler = nextHandler;}@Overridepublic void handleRequest(LeaveRequest request) {if (request.getDays() <= 2) {log.info("审批流程处理 -> 经理");} else if (nextHandler != null) {nextHandler.handleRequest(request);}}
}
4、总监处理器(Commissioner)
@Slf4j
public class Commissioner implements LeaveRequestHandler {private LeaveRequestHandler nextHandler;@Overridepublic void setNextHandler(LeaveRequestHandler nextHandler) {this.nextHandler = nextHandler;}@Overridepublic void handleRequest(LeaveRequest request) {if (request.getDays() <= 5) {log.info("审批流程处理 -> 总监");} else {nextHandler.handleRequest(request);}}
}
5、CTO处理器(CTO)
@Slf4j
public class CTO implements LeaveRequestHandler {private LeaveRequestHandler nextHandler;@Overridepublic void setNextHandler(LeaveRequestHandler nextHandler) {this.nextHandler = nextHandler;}@Overridepublic void handleRequest(LeaveRequest request) {if (request.getDays() > 5) {log.info("审批流程处理 -> CTO");} else {log.info("没有流程节点");}}
}
6、客户端(Client)
@Slf4j
public class Client {public static void main(String[] args) {LeaveRequestHandler manager = new Manager();LeaveRequestHandler commissioner = new Commissioner();LeaveRequestHandler cto = new CTO();manager.setNextHandler(commissioner);commissioner.setNextHandler(cto);log.info("请假10天");LeaveRequest request = new LeaveRequest(10);manager.handleRequest(request);}
}
输出控制台:
请假10天
审批流程处理 -> CTO
三、总结
1、优点
- 降低耦合度。将请求的发送者和接收者解耦。
- 简化对象。对象不需要知道链的结构。
- 增加新的请求处理类很方便。
- 增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。
2、缺点
- 不能保证请求一定被接收。
- 对比较长的职责链,系统性能将受到一定影响。而且在进行代码调试时不太方便,可能会造成循环调用。
3、应用场景
- 有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。
- 在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
- 可动态指定一组对象处理请求。
相关文章:
【玩转23种Java设计模式】行为型模式篇:责任链模式
软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。 汇总目录链接&…...
【C#】获取电脑CPU、内存、屏幕、磁盘等信息
通过WMI类来获取电脑各种信息,参考文章:WMI_04_常见的WMI类的属性_wmi scsilogicalunit_fantongl的博客-CSDN博客 自己整理了获取电脑CPU、内存、屏幕、磁盘等信息的代码 #region 系统信息/// <summary>/// 电脑信息/// </summary>public p…...
途乐证券-最准确的KDJ改良指标?
KDJ目标是技术剖析的一种重要目标之一,它是利用随机目标(%R)发展而来的,是一种反映商场超买和超卖状况的买卖目标。KDJ目标由快线(K线)、慢线(D线)和随机值(J线ÿ…...
数据结构——线性表
文章目录 线性表的定义和基本操作顺序表线性表的链式表示 线性表的定义和基本操作 线性表是具有相同数据类型的(n≥0)个数据元素的有限序列,其中n为表长,当n0时线性表是一个空表。若用L命名线性表,则其中一般表示为:L(a1,a2,a3, …...
SpringBoot系列之基于Jersey实现文件上传API
前言 JAX-RS:JAX-RS是可以用可以用于实现RESTFul应用程序的JAVA API,给开发者提供了一系列的RESTFul注解Jersey:是基于JAX-RX API的实现框架,用于实现RESTful Web 服务的开源框架。 JAX-RX常用的注解: javax.ws.rs.Pa…...
【LangChain】Prompts之示例选择器
LangChain学习文档 【LangChain】向量存储(Vector stores)【LangChain】向量存储之FAISS【LangChain】Prompts之Prompt templates【LangChain】Prompts之自定义提示模板【LangChain】Prompts之示例选择器 概要 如果您有大量示例,您可能需要选择要包含在提示中的哪…...
Neo4j之CREATE基础
在 Neo4j 中,CREATE 语句用于创建节点、关系以及节点属性。 创建节点: CREATE (p:Person {name: John, age: 30});这个查询会创建一个具有 "Person" 标签的节点,节点属性包括 "name" 和 "age"。 创建带有关…...
Kali Hyper-V安装正常启动后 黑屏 只能进命令模式
问题: Hyper-V安装虚拟机Kali系统一切安装正常, 没有出现错误. 安装成功后重启,只能进入命令模式,tt1-tt6,进不去GUI桌面. 尝试: 一代二代虚拟硬盘都试过,同样问题,只能开进后进入命令模式,在命令模式下一切运行正常, 也修复过系统 GNOM等的,不管用. 以下为国外论坛给的建议,尝…...
【人工智能124种任务大集合】-集齐了自然语言处理(NLP),计算机视觉(CV),语音识别,多模态等任务
大家好,我是微学AI,今天给大家介绍一下人工智能124种任务大集合,任务集合主要包括4大类:自然语言处理(NLP)、计算机视觉(CV)、语音识别、多模态任务。 我这里整理了124种应用场景任…...
IntelliJ IDEA快捷键大全
文章目录 1、构建/编译2、文本编辑3、光标操作4、文本选择5、代码折叠6、辅助编码7、上下文导航8、查找操作9、符号导航10、代码分析11、运行和调试12、代码重构13、全局 CVS 操作14、差异查看器15、工具窗口 本文参考了 IntelliJ IDEA 的官网,列举了IntelliJ IDEA&…...
阿里云轻量应用服务器_2核4G4M_2核2G3M_性能测评
阿里云轻量应用服务器2核2G3M带宽108元一年,系统盘为50GB高效云盘;轻量服务器2核4G4M带宽,60GB高效云盘297.98元12个月。目前轻量应用服务器只有2核2G和2核4G有活动,阿里云百科分享阿里云轻量应用服务器入口: 目录 阿…...
猿人学刷题系列(第一届比赛)——第二题( js 混淆 - 动态cookie 1)
题目:提取全部5页发布日热度的值,计算所有值的加和 地址:https://match.yuanrenxue.cn/match/2 思路分析 本题我们会简单说一下两种不同的方式去处理,一种是不还原混淆代码直接从源代码硬扣生成逻辑,另一种则是还原…...
ubuntu网络管理
主机-ip,service—port 分别查看/etc/hosts,/etc/host.conf;/etc/services,/etc/resolv.conf; 内核更新——linux-image-generic 6.2.0-24.24 非常抱歉,我误解了你的问题。如果你想更新已安装的内核版本…...
您可能并不需要单页应用程序
前端框架的迅速崛起,如React、Angel、Vue.js、Elm等,使得单页面应用程序(Single Page Application)在网络上无处不在。对于许多开发人员来说,这些已经成为他们“默认”工具集的一部分。当他们开始一个新项目时…...
基于低代码和数字孪生技术的电力运维平台设计
电力能源服务商在为用能企业提供线上服务的时候,不可避免要面对用能企业的各种个性化需求。如果这些需求和想法都要靠平台厂家研发人员来实现,那在周期、成本、效果上都将是无法满足服务运营需要的,这也是目前很多线上能源云平台应用效果不理…...
【Github】SourceTree技巧汇总
sourceTree登录github账户 会跳转到浏览器端 按照Git Flow 初始化仓库分支 克隆远程仓库到本地 推送变更到远程仓库 合并分支 可以看到目前的本地分支(main、iOS_JS)和远程分支(origin/main、origin/HEAD、origin/iOS_JS)目前所处…...
人工智能轨道交通行业周刊-第55期(2023.8.7-8.13)
本期关键词:北京智慧交通规划、成都数智化规划、关门车、集装箱标志、大模型隐私、视觉大模型 1 整理涉及公众号名单 1.1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通联盟VSTR铁路与城市轨道交…...
向量数据库 Milvus Cloud Partition Key:租户数量多,单个租户数据少的三种解决方案
三种解决方案 这个问题提出的时候,Milvus 的最新版本是 2.2.8,我们做个角色互换,在当时站在这个用户的角度,留在我们面前的选择有这么几个: 为每个租户创建一个 collection 为每个租户创建一个 partition 创建一个租户名称的标量字段 接下来,我们依次分析下这三种方案的可…...
文本三剑客之grep命令和awk命令 1.0 版本
grep awk 1.grep命令1.1 基本格式1.2 常用选项 2.awk命令2.1 awk工作原理2.2 awk命令格式2.3 awk常用内置变量 1.grep命令 1.1 基本格式 grep [选项]… 查找条件 目标文件1.2 常用选项 选项功能 -m [ x ]匹配x次 后停止,x为具体数字-v取反 -i忽略字符大小写 -n显示匹配的 …...
【软件测试】Linux环境Ant调用Jmeter脚本并且生成测试报告(详细)
目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 准备工作 需要在…...
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...
【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
