❤ 作者主页:欢迎来到我的技术博客😎
❀ 个人介绍:大家好,本人热衷于Java后端开发,欢迎来交流学习哦!( ̄▽ ̄)~*
🍊 如果文章对您有帮助,记得关注、点赞、收藏、评论⭐️⭐️⭐️
📣 您的支持将是我创作的动力,让我们一起加油进步吧!!!🎉🎉
一、责任链模式的定义
责任链模式(Chain of Responsibility)又名 职责链模式,是一种行为设计模式,它允许你构建一个由多个对象组成的链,每个对象都有机会处理请求,或者将请求传递给链中的下一个对象。这种模式常用于处理请求的对象之间存在 层次关系 的情况。责任链模式的主要目的是解耦发送者和接收者,使多个对象都有机会处理请求,而不是将请求发送者与接收者硬编码在一起。
在责任链模式中,每个处理者都包含一个对下一个处理者的引用,形成一个链条。当请求进入链条时,从链条的头部开始逐个处理,直到找到能够处理该请求的对象为止。如果没有找到合适的处理者,请求可以被忽略或者采取默认的处理方式。
二、责任链模式的结构
责任链模式包含以下的重要角色:
- 抽象处理者(Handler): 定义一个处理请求的接口,包含抽象处理方法并维护一个对下一个处理者的引用;
- 具体处理者(Concrete Handler): 实现处理请求的接口,判断能否处理本次请求,如果能够处理则处理,否则将请求传递给下一个处理者。
- 客户端类(Client): 创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程。
三、责任链模式的实现
需求案例:在公司的采购审批流程中,一般根据采购金额的不同需要由不同角色的领导来进行审核。例如,采购部的员工发出采购申请的请求(包含采购金额),一开始是组长接受请求并处理:
- 如果采购金额小于2000的话,则组长可以直接同意批准采购;
- 如果采购金额介于2000到5000之间的话,则组长同意批准采购之后还需要将采购申请提交到给经理,由经理审核是否同意批准采购;
- 如果采购金额大于5000,则不仅需要组长和经理审核同意,还需要由经理将采购申请提交到总经理,由总经理再次审核是否同意批准采购。
类似于上述的业务场景使用责任链模式就可以很好地解决问题。
具体的流程如下:
使用责任链模式实现上述案例,类图如下:
具体的类设计如下:
抽象处理者类:
public abstract class HandleRequest {
//声明上级领导
public HandleRequest nextHandle;
//设置上级领导对象
public void setHandleRequest(HandleRequest nextHandle) {
this.nextHandle = nextHandle;
}
//提交采购请求
public abstract void handleLeaveRequest(LeaveRequest leaveRequest);
}
组长类(具体的处理者):
public class GroupLeader extends HandleRequest{
@Override
public void handleLeaveRequest(LeaveRequest leaveRequest) {
if (leaveRequest.getAmount() < 2000) {
System.out.println("采购流程审核结果:组长同意批准采购");
System.out.println("采购流程审核结束");
} else if (nextHandle != null) {
System.out.println("审核第一步:组长同意批准采购, 等待上级领导审核中...");
nextHandle.handleLeaveRequest(leaveRequest);
}
}
}
经理类(具体的处理者):
public class Manage extends HandleRequest{
@Override
public void handleLeaveRequest(LeaveRequest leaveRequest) {
if (leaveRequest.getAmount() >= 2000 && leaveRequest.getAmount() <= 5000) {
System.out.println("采购流程审核结果:经理同意批准采购");
System.out.println("采购流程审核结束");
} else if (nextHandle != null) {
System.out.println("审核第二步:经理同意批准采购, 等待上级领导审核中...");
nextHandle.handleLeaveRequest(leaveRequest);
}
}
}
总经理类(具体的处理者):
public class GeneralManager extends HandleRequest{
@Override
public void handleLeaveRequest(LeaveRequest leaveRequest) {
if (leaveRequest.getAmount() > 5000) {
System.out.println("采购流程审核结果:总经理同意批准采购");
System.out.println("采购流程审核结束");
} else {
System.out.println("不同意该采购申请");
}
}
}
采购请求类:
public class LeaveRequest {
private double amount;
public LeaveRequest(double amount) {
this.amount = amount;
}
public double getAmount() {
return amount;
}
}
客户端类:
public class Client {
public static void main(String[] args) {
//创建责任链
GroupLeader groupLeader = new GroupLeader();
Manage manage = new Manage();
GeneralManager generalManager = new GeneralManager();
//设置责任链关系
groupLeader.setHandleRequest(manage);
manage.setHandleRequest(generalManager);
//发起采购请求
LeaveRequest request1 = new LeaveRequest(1600);
LeaveRequest request2 = new LeaveRequest(3800);
LeaveRequest request3 = new LeaveRequest(6200);
//处理采购请求
System.out.println("------采购金额为1600的审核流程情况------");
groupLeader.handleLeaveRequest(request1);
System.out.println("------采购金额为3800的审核流程情况------");
groupLeader.handleLeaveRequest(request2);
System.out.println("------采购金额为6200的审核流程情况------");
groupLeader.handleLeaveRequest(request3);
}
}
测试结果如下:
四、责任链模式的优缺点
优点:
- 松散耦合: 责任链模式使得请求发送者和接收者解耦,每个处理者仅需关心自己能否处理请求,而不需要知道整个处理流程的细节。
- 灵活性: 可以动态地改变处理者之间的关系和顺序,新增或删除处理者,以适应不同的需求和场景。
- 可扩展性: 容易添加新的处理者,无需修改现有的代码,符合开闭原则。
- 单一职责原则: 每个具体处理者只负责处理特定类型的请求,符合单一职责原则,使得代码更清晰和可维护。
缺点:
- 性能问题: 在责任链比较长的情况下,请求可能需要遍历整个链条才能找到合适的处理者,可能影响性能。
- 可能导致请求无法处理: 如果责任链没有被正确配置,或者某个请求没有得到处理,可能导致请求无法被处理。
- 不容易观察运行时的特征: 由于责任链的处理者是动态组合的,难以在运行时直观地观察到整个处理流程。
- 可能引入安全问题: 如果责任链的配置不当,某个处理者可能被滥用,导致安全问题。
五、责任链模式的使用场景
- 审批流程: 当一个请求需要经过多个处理者进行审批时,可以使用责任链模式。每个处理者负责不同级别的审批,直到找到合适的处理者为止。
- 日志记录: 在日志系统中,可以使用责任链模式处理不同级别的日志信息。每个处理者对应一个日志级别,形成责任链,便于灵活控制日志的输出。
- 事件处理: 当系统中存在多个对象负责处理不同类型的事件时,可以使用责任链模式。每个处理者处理特定类型的事件,形成事件处理链。
- 过滤器链: 在需要按顺序执行多个过滤操作的场景中,可以使用责任链模式。每个过滤器负责一个过滤操作,形成过滤器链。
- 异常处理: 在异常处理中,可以使用责任链模式处理不同类型的异常。每个处理者负责处理特定类型的异常,形成异常处理链。
- 请求转发: 在 Web 开发中,可以使用责任链模式实现请求的转发。每个处理者负责处理特定类型的请求,如果无法处理,则将请求转发给下一个处理者。
- 工作流程引擎: 责任链模式可以用于实现工作流程引擎,其中每个节点负责执行一部分工作,流程按照责任链顺序逐步执行。
非常感谢您阅读到这里,如果这篇文章对您有帮助,希望能留下您的点赞👍 关注💖 分享👥 留言💬thanks!!!