前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【设计模式】之责任链模式

【设计模式】之责任链模式

作者头像
青山师
发布2023-05-05 17:27:05
2390
发布2023-05-05 17:27:05
举报
文章被收录于专栏:IT当时语_青山师_JAVA技术栈

责任链模式

概念

责任链,顾名思义,就是用来处理相关事务责任的一条执行链,执行链上有多个节点,每个节点都有机会(条件匹配)处理请求事务,如果某个节点处理完了就可以根据实际业务需求传递给下一个节点继续处理或者返回处理完毕。

场景

现实中,请假的OA申请,请假天数如果是半天到1天,可能直接主管批准即可; 如果是1到3天的假期,需要部门经理批准; 如果是3天到30天,则需要总经理审批; 大于30天,正常不会批准。

类图

为了实现上述场景,我们可以采用责任链设计模式。

  • 员工提交请求类:LeaveRequest。
  • 抽象的请假责任处理类:AbstractLeaveHandler。
  • 直接主管审批处理类:DirectLeaderLeaveHandler。
  • 部门经理处理类:DeptManagerLeaveHandler。
  • 总经理处理类: GManagerLeaveHandler。

员工请求发起申请到抽象的责任处理类中,根据员工的请假天数,对应的处理类完成处理。 每一个责任处理类设置下面的节点。自身处理不了则传递给下一个节点处理。

实现

LeaveRequest.java:

代码语言:javascript
复制
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class LeaveRequest {
    /**天数*/
    private int leaveDays;

    /**姓名*/
    private String name;
}

AbstractLeaveHandler.jav;

代码语言:javascript
复制
/**
 * @program: cookbook
 * @description: 请假责任链抽象处理类
 * @author: Byron
 * @create: 2019/07/11 09:34
 */
public class AbstractLeaveHandler {
    /**直接主管审批处理的请假天数*/
    protected int MIN = 1;
    /**部门经理处理的请假天数*/
    protected int MIDDLE = 3;
    /**总经理处理的请假天数*/
    protected int MAX = 30;

    /**领导名称*/
    protected String handlerName;

    /**下一个处理节点(即更高级别的领导)*/
    protected AbstractLeaveHandler nextHandler;

    /**设置下一节点*/
    protected void setNextHandler(AbstractLeaveHandler handler){
        this.nextHandler = handler;
    }

    /**处理请假的请求,子类实现*/
    protected void handlerRequest(LeaveRequest request){

    }


}

DirectLeaderLeaveHandler.jav:

代码语言:javascript
复制
/**
 * @program: cookbook
 * @description: 直接主管处理类
 * @author: Byron
 * @create: 2019/07/11 09:46
 */
public class DirectLeaderLeaveHandler extends AbstractLeaveHandler{
    public DirectLeaderLeaveHandler(String name) {
        this.handlerName = name;
    }

    @Override
    protected void handlerRequest(LeaveRequest request) {
        if(request.getLeaveDays() <= this.MIN){
            System.out.println("直接主管:" + handlerName + ",已经处理;流程结束。");
            return;
        }

        if(null != this.nextHandler){
            this.nextHandler.handlerRequest(request);
        }else{
            System.out.println("审批拒绝!");
        }

    }
}

DeptManagerLeaveHandler.java:

代码语言:javascript
复制
/**
 * @program: cookbook
 * @description: 部门经理处理类
 * @author: Byron
 * @create: 2019/07/11 09:48
 */
public class DeptManagerLeaveHandler extends AbstractLeaveHandler {

    public DeptManagerLeaveHandler(String name) {
        this.handlerName = name;
    }

    @Override
    protected void handlerRequest(LeaveRequest request) {
        if(request.getLeaveDays() >this.MIN && request.getLeaveDays() <= this.MIDDLE){
            System.out.println("部门经理:" + handlerName + ",已经处理;流程结束。");
            return;
        }

        if(null != this.nextHandler){
            this.nextHandler.handlerRequest(request);
        }else{
            System.out.println("审批拒绝!");
        }
    }
}

GManagerLeaveHandler.java:

代码语言:javascript
复制
/**
 * @program: cookbook
 * @description: 总经理处理类
 * @author: Byron
 * @create: 2019/07/11 09:49
 */
public class GManagerLeaveHandler extends AbstractLeaveHandler {
    public GManagerLeaveHandler(String name) {
        this.handlerName = name;
    }

    @Override
    protected void handlerRequest(LeaveRequest request) {
        if(request.getLeaveDays() > this.MIDDLE && request.getLeaveDays() <= this.MAX){
            System.out.println("总经理:" + handlerName + ",已经处理;流程结束。");
            return;
        }

        if(null != this.nextHandler){
            this.nextHandler.handlerRequest(request);
        }else{
            System.out.println("审批拒绝!");
        }
    }
}

演示

ResponsibilityTest.java:

代码语言:javascript
复制
public class ResponsibilityTest {
    public static void main(String[] args) {
        LeaveRequest request = LeaveRequest.builder().leaveDays(20).name("小明").build();


        AbstractLeaveHandler directLeaderLeaveHandler = new DirectLeaderLeaveHandler("县令");
        DeptManagerLeaveHandler deptManagerLeaveHandler = new DeptManagerLeaveHandler("知府");
        GManagerLeaveHandler gManagerLeaveHandler = new GManagerLeaveHandler("京兆尹");

        directLeaderLeaveHandler.setNextHandler(deptManagerLeaveHandler);
        deptManagerLeaveHandler.setNextHandler(gManagerLeaveHandler);

        directLeaderLeaveHandler.handlerRequest(request);


    }
}
  • 20天,运行输出: 总经理:京兆尹,已经处理;流程结束。
  • 1天,运行输出: 直接主管:县令,已经处理;流程结束。
  • 3天,运行输出: 部门经理:知府,已经处理;流程结束。
  • 35天,运行输出: 审批拒绝!

总结

责任链主要重在责任分离处理,让各个节点各司其职。 责任链上的各个节点都有机会处理事务,但是也可能不会受理请求。 责任链比较长,调试时可能会比较麻烦。 责任链一般用于处理流程节点之类的实际业务场景中。 Spring拦截器链、servlet过滤器链等都采用了责任链设计模式。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-10-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 责任链模式
    • 概念
      • 场景
        • 类图
          • 实现
            • 演示
              • 总结
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档