? 作者主页:欢迎来到我的技术博客😎
? 个人介绍:大家好,本人热衷于Java后端开发,欢迎来交流学习哦!( ̄▽ ̄)~*
🍊 如果文章对您有帮助,记得关注、点赞、收藏、评论??????
📣 您的支持将是我创作的动力,让我们一起加油进步吧!!!🎉🎉
责任链模式(Chain of Responsibility)又名 职责链模式,是一种行为设计模式,它允许你构建一个由多个对象组成的链,每个对象都有机会处理请求,或者将请求传递给链中的下一个对象。这种模式常用于处理请求的对象之间存在 层次关系 的情况。责任链模式的主要目的是解耦发送者和接收者,使多个对象都有机会处理请求,而不是将请求发送者与接收者硬编码在一起。
在责任链模式中,每个处理者都包含一个对下一个处理者的引用,形成一个链条。当请求进入链条时,从链条的头部开始逐个处理,直到找到能够处理该请求的对象为止。如果没有找到合适的处理者,请求可以被忽略或者采取默认的处理方式。
责任链模式包含以下的重要角色:
需求案例:在公司的采购审批流程中,一般根据采购金额的不同需要由不同角色的领导来进行审核。例如,采购部的员工发出采购申请的请求(包含采购金额),一开始是组长接受请求并处理:
类似于上述的业务场景使用责任链模式就可以很好地解决问题。
具体的流程如下:
?
使用责任链模式实现上述案例,类图如下:
?
具体的类设计如下:
抽象处理者类:
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);
}
}
测试结果如下:
优点:
缺点:
?
非常感谢您阅读到这里,如果这篇文章对您有帮助,希望能留下您的点赞👍 关注💖 分享👥 留言💬thanks!!!