Java设计模式:责任链模式

发布时间:2024年01月11日

? 作者主页:欢迎来到我的技术博客😎
? 个人介绍:大家好,本人热衷于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);

    }
}

测试结果如下:
在这里插入图片描述


四、责任链模式的优缺点

优点:

  1. 松散耦合: 责任链模式使得请求发送者和接收者解耦,每个处理者仅需关心自己能否处理请求,而不需要知道整个处理流程的细节。
  2. 灵活性: 可以动态地改变处理者之间的关系和顺序,新增或删除处理者,以适应不同的需求和场景。
  3. 可扩展性: 容易添加新的处理者,无需修改现有的代码,符合开闭原则。
  4. 单一职责原则: 每个具体处理者只负责处理特定类型的请求,符合单一职责原则,使得代码更清晰和可维护。

缺点:

  1. 性能问题: 在责任链比较长的情况下,请求可能需要遍历整个链条才能找到合适的处理者,可能影响性能。
  2. 可能导致请求无法处理: 如果责任链没有被正确配置,或者某个请求没有得到处理,可能导致请求无法被处理。
  3. 不容易观察运行时的特征: 由于责任链的处理者是动态组合的,难以在运行时直观地观察到整个处理流程。
  4. 可能引入安全问题: 如果责任链的配置不当,某个处理者可能被滥用,导致安全问题。

五、责任链模式的使用场景

  1. 审批流程: 当一个请求需要经过多个处理者进行审批时,可以使用责任链模式。每个处理者负责不同级别的审批,直到找到合适的处理者为止。
  2. 日志记录: 在日志系统中,可以使用责任链模式处理不同级别的日志信息。每个处理者对应一个日志级别,形成责任链,便于灵活控制日志的输出。
  3. 事件处理: 当系统中存在多个对象负责处理不同类型的事件时,可以使用责任链模式。每个处理者处理特定类型的事件,形成事件处理链。
  4. 过滤器链: 在需要按顺序执行多个过滤操作的场景中,可以使用责任链模式。每个过滤器负责一个过滤操作,形成过滤器链。
  5. 异常处理: 在异常处理中,可以使用责任链模式处理不同类型的异常。每个处理者负责处理特定类型的异常,形成异常处理链。
  6. 请求转发: 在 Web 开发中,可以使用责任链模式实现请求的转发。每个处理者负责处理特定类型的请求,如果无法处理,则将请求转发给下一个处理者。
  7. 工作流程引擎: 责任链模式可以用于实现工作流程引擎,其中每个节点负责执行一部分工作,流程按照责任链顺序逐步执行。

?
非常感谢您阅读到这里,如果这篇文章对您有帮助,希望能留下您的点赞👍 关注💖 分享👥 留言💬thanks!!!

文章来源:https://blog.csdn.net/m0_52691962/article/details/135343280
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。