责任链模式 Chain of Responsibility

server/2024/12/3 0:51:52/

1 意图

使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

2 结构

在这里插入图片描述

  • Handler 定义一个处理请求的接口;(可选)实现后继链。

  • ConcreteHandler 处理它所负责的请求;可访问它的后继者;如果可处理该请求理它,否则将该请求转发给后继者。

  • Client 向链上的具体处理者**(ConcreteHandler)**对象提交请求。

3 适用性

Chain ofResponsibility 模式适用于以下条件:

  • 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。

  • 想在不明确指定接收者的情况下向多个对象中的一个提交一个请求。

  • 可处理一个请求的对象集合应被动态指定。

4 应用举例

1 应用案例:请假审批流程

假设在一个公司中,员工请假需要经过不同级别的审批,例如,1天以内的请假由直接上级批准,2天到5天的请假由部门经理批准,超过5天的请假由人力资源部批准。我们可以使用责任链模式来实现这样的审批流程。

Java代码示例:

// 抽象处理者
abstract class LeaveApprover {protected LeaveApprover nextApprover; // 后继处理者public void setNextApprover(LeaveApprover nextApprover) {this.nextApprover = nextApprover;}// 审批请假public abstract void processRequest(int leaveDays);
}// 直接上级
class DirectSupervisor extends LeaveApprover {@Overridepublic void processRequest(int leaveDays) {if (leaveDays <= 1) {System.out.println("直接上级批准了 " + leaveDays + " 天的请假。");} else {if (nextApprover != null) {nextApprover.processRequest(leaveDays);} else {System.out.println("没有后续处理者,无法审批超过 " + leaveDays + " 天的请假。");}}}
}// 部门经理
class DepartmentManager extends LeaveApprover {@Overridepublic void processRequest(int leaveDays) {if (leaveDays <= 5) {System.out.println("部门经理批准了 " + leaveDays + " 天的请假。");} else {if (nextApprover != null) {nextApprover.processRequest(leaveDays);} else {System.out.println("没有后续处理者,无法审批超过 " + leaveDays + " 天的请假。");}}}
}// 人力资源部
class HRDepartment extends LeaveApprover {@Overridepublic void processRequest(int leaveDays) {System.out.println("人力资源部批准了 " + leaveDays + " 天的请假。");}
}public class ChainOfResponsibilityDemo {public static void main(String[] args) {LeaveApprover directSupervisor = new DirectSupervisor();LeaveApprover departmentManager = new DepartmentManager();LeaveApprover hrDepartment = new HRDepartment();// 构建责任链directSupervisor.setNextApprover(departmentManager);departmentManager.setNextApprover(hrDepartment);// 提交请假申请int leaveDays = 3;directSupervisor.processRequest(leaveDays); // 将请求发送给直接上级leaveDays = 7;directSupervisor.processRequest(leaveDays); // 再次提交更长时间的请假申请}
}

在这个例子中:

  • LeaveApprover 是抽象处理者,定义了处理请求的接口。
  • DirectSupervisor, DepartmentManager, HRDepartment 分别是具体处理者,每个处理者都有自己的判断逻辑,如果当前处理者不能处理请求,则会将其传递给下一个处理者。

通过责任链模式,我们可以灵活地添加、删除或修改处理者,而不影响其他部分的代码,这使得系统具有更好的扩展性和维护性。


http://www.ppmy.cn/server/140555.html

相关文章

Pr 视频过渡:沉浸式视频 - VR 随机块

效果面板/视频过渡/沉浸式视频/VR 随机块 Video Transitions/Immersive Video/VR Random Blocks VR 随机块 VR Random Blocks主要用于在 VR 视频中创建块状随机分布的过渡效果。 自动 VR 属性 Auto VR Properties 默认勾选&#xff0c;使效果自动适应 VR 素材的属性&#xff0…

RNN(循环神经网络)详解

1️⃣ RNN介绍 前馈神经网络&#xff08;CNN&#xff0c;全连接网络&#xff09;的流程是前向传播、反向传播和参数更新&#xff0c;存在以下不足&#xff1a; 无法处理时序数据&#xff1a;时序数据长度一般不固定&#xff0c;而前馈神经网络要求输入和输出的维度是固定的&a…

Pytorch基本语法

Pytorch Pytorch的基本使用基本使用张量的简介1.张量的基本类型2.张量的创建1).基本创建方式1.torch.tensor()根据指定数据创建张量2.torch.Tensor() 根据指定形状创建张量&#xff0c;也可以用来创建指定数据的张量3.torch.IntTensor()、torch.FloatTensor()、torch.DoubleTen…

30. 串联所有单词的子串

30. 串联所有单词的子串 题目思路对解题思路的概述具体实现 题目 原题&#xff1a; 串联所有单词的子串 思路 思路一&#xff1a;列出0到字符串数组长度的数字全排列&#xff0c;比如数组长度为3&#xff0c;则求出 012 021 102 120 201 210,然后遍历全排列求得的解&#xf…

使用EasyExcel实现excel导入

下文将简述在SpringBoot如何使用EasyExcel,从多sheet页&#xff0c;上万级数据excel导入到数据库中&#xff0c;本文使用mybatis作为ORM映射框架 准备环境 创建用户表users 创建用户实体对象级底层方法 userMapper.xml中定义批量增加方法 <insert id"batchSave&qu…

贪心算法day2(最长递增子序列)

目录 1.最长递增子序列 方法一&#xff1a;动态规划 方法二&#xff1a;贪心二分查找 1.最长递增子序列 链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 方法一&#xff1a;动态规划 思路&#xff1a;我们定义dp[i]为最长递增子序列&#xff0c;那么dp[j]就是…

Rust项目中的Labels

姊妹篇: Go项目中的Labels 按照issue数量从多到少排序: https://github.com/rust-lang/rust/labels?page2&sortcount-desc https://github.com/rust-lang/rust/labels/A-contributor-roadblock 第1页: 标签/中文说明数字T-compiler/编译器Relevant to the compiler tea…

笔记--(网络3)、交换机、VLAN

交换机 交换机&#xff08;Switch&#xff09;意为“开关”是一种用于电&#xff08;光&#xff09;信号转发的网络设备。它可以为接入交换机的任意两个网络节点提供独享的电信号通路。最常见的交换机是以太网交换机。其他常见的还有电话语音交换机、光纤交换机等。 交换机的…