设计模式-请假流程-责任链模式

责任链模式的定义

​ 首先我们可以先看一下责任链模式的定义:

​ Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request.Chain the receiving objects and pass the request along the chain until an object handles it.(使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。)

责任链模式的通用类图(觉得不好理解的可以跳过往下看)

​ 下面我们再看一下责任链模式定义的通用的类图是什么样子的,这里我是参考的《设计模式之禅》中描述的类图,看着是不是非常的简单啊。

img

​ 这里说明一下,上面所说的Client肯定就是责任链路的调用方了,也就是request请求的发起方;Handler是个抽象的请求处理者,它的内部存在一个handlerRequest()的抽象方法,里面的内容是处理请求的详细业务逻辑。下面的ConcreteHandler是处理者的其中一个实现类,它会实现详细的处理逻辑,不过我觉得这里应该再多加几个实现类更好理解一些。

​ 那么如何以链路的形式存在呢,这里就是Handler这个抽象类中定义一个Handler的局部变量,并且提供一个next()方法进行赋值,这里注意一下上面的类图并没有详细的写出来,所以看着可能有点儿不好理解,下面给一下代码示例就好理解了。

Handler抽象类实现代码如下:

public abstract class Handler {
    private Handler nextHandler;

    //每个处理者都必须对请求做出处理
    public final Response handleMessage(Request request) {
        Response response = null; //判断是否是自己的处理级别
        if (this.getHandlerLevel().equals(request.getRequestLevel())) {
            response = this.echo(request);
        } else {
            // 不属于自己的处理级别,判断是否有下一个处理者
            if (this.nextHandler != null) {
                response = this.nextHandler.handleMessage(request);
            } else {
                //没有适当的处理者,业务自行处理
            }
        }
        return response;
    }

    //设置下一个处理者是
    public void setNext(Handler _handler) {
        this.nextHandler = _handler;
    }

    //每个处理者都有一个处理级别 每个处理者都必须实现处理任务
    protected abstract Level getHandlerLevel();

    protected abstract Response echo(Request request);
}

请假流程逻辑说明

假设让我们实现一个请假流程的功能,请假的业务规则如下所示:

img

一个员工进行请假的话,如果是1天以内(包含一天),直接小组长进行审批就可以了。如果是大于1天小于3天,流程继续向下走,需要部门经理进行批准,如果请假天数超过3天以上CTO审批。

这个流程还是非常好理解的,就是一个链式的流程结构,如果符合某些规则就会请求继续往下一个节点执行。

责任链模式实现请假流程处理流程图

img

实现请假流程操作的流程图如上图所示,Approvehandler是抽象的审批流程处理者,doHandler(int)方法是对请假天数(传参就是请假天数,方便理解,尽量方法简单)的一个逻辑处理方法;next方法是用来作为传入下一个节点的对象,我们可以参考一下链表的Node对象就明白了,里面变量也有next、pro类型都是Node类型的!

下面的Handler的实现类GroupLeaderApproveHandler、DepartLeaderApproveHandler、CTOApproveHandler相对来说好理解一些,直接实现自己的处理的逻辑就可以了。

然后就是我们的调用方的使用EmployeeClient,我们只需要创建好请假方法,在里面初始化好对应的处理者节点,然后调用doHandler方法就可以了。

责任链模式请假流程代码实现

idea中代码设计的diagram类图如下所示:

img

ApproveHandler.java

/**
 * @author gengcc
 * @version 1.0
 * @ClassName ApproveHandler
 * @description 抽象的审批处理器
 * @date 2021/9/29 10:48
 */
public abstract class ApproveHandler {

    protected ApproveHandler next;

    /**
     * 指定下一个处理者
     *
     * @param approveHandler
     * @author gengcc
     * @date 2021/9/29 10:51
     */
    public void next(ApproveHandler approveHandler) {
        this.next = approveHandler;
    }

    /**
     * 处理审批请假天数
     *
     * @param size
     * @author gengcc
     * @date 2021/9/29 10:54
     */
    public abstract void doHandler(int size);
}

GroupLeaderApproveHandler.java

/**
 * @author gengcc
 * @version 1.0
 * @ClassName LeaderApproveHandler
 * @description
 * @date 2021/9/29 10:53
 */
public class GroupLeaderApproveHandler extends ApproveHandler {
    @Override
    public void doHandler(int size) {
        System.out.println("group leader 审批通过!");
        if (size <= 1) {
            return;
        }
        next.doHandler(size);
    }
}

DepartLeaderApproveHandler.java

/**
 * @author gengcc
 * @version 1.0
 * @ClassName LeaderApproveHandler
 * @description
 * @date 2021/9/29 10:53
 */
public class DepartLeaderApproveHandler extends ApproveHandler {
    @Override
    public void doHandler(int size) {
        System.out.println("depart leader 审批通过!");
        if (size <= 3) {
            return;
        }
        next.doHandler(size);
    }
}

CTOApproveHandler.java

/**
 * @author gengcc
 * @version 1.0
 * @ClassName CTOApproveHandler
 * @description
 * @date 2021/9/29 10:57
 */
public class CTOApproveHandler extends ApproveHandler {
    @Override
    public void doHandler(int size) {
        if (size > 3) {
            System.out.println("cto 审批通过!");
        }
        return;
    }
}

EmployeeClient.java

/**
 * @author gengcc
 * @version 1.0
 * @ClassName ApproveMain
 * @description
 * @date 2021/9/29 11:00
 */
public class EmployeeClient {

    /**
     * 模拟请假请求
     * @author gengcc
     * @date  2021/10/12 11:38
     */
    public static void main(String[] args) {
        // 设置请假添加
        int size = 5;
        // 处理器初始化
        ApproveHandler groupLeaderHandler = new GroupLeaderApproveHandler();
        ApproveHandler departLeaderHandler = new DepartLeaderApproveHandler();
        ApproveHandler ctoHandler = new CTOApproveHandler();
        groupLeaderHandler.next(departLeaderHandler);
        departLeaderHandler.next(ctoHandler);
        // 请假者只需要向组长发起审批请求就可以了
        groupLeaderHandler.doHandler(size);
    }
}

总结

​ 其实这里给出的请假流程只是方便我们去理解责任链模式的一个使用,等我们了解了什么是责任链模式,下面我们就可以进行工作中的一些实战,实际上我们工作中对于责任链模式的使用有个场景非常合适,就是ETL过程中的中间环节Transformation也就是数据转换或者说是数据处理,这个数据处理的过程有数据清洗、提取、标识、关联等操作环节,而且特点是顺序不是固定的,而是允许我们任意组装,这种场景是非常适合使用责任链模式的,当然中间还夹杂着其他设计模式的使用。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
假设我们需要设计一个请假审批系统,系统中有多个级别的审批人,包括组长、经理、总经理等,每个级别的审批人可以处理不同级别的请假申请,如果一个审批人无法处理请求,则将请求转发给下一个级别的审批人。下面是Java责任链模式设计一套流程系统的实现步骤: 1. 定义请求类LeaveRequest,其中包含请假人姓名、请假天数、请假原因等信息。 2. 定义抽象处理类LeaveHandler,其中包含一个对下一个处理器的引用,以及一个抽象方法handleRequest,用于处理请求。 3. 定义具体处理类GroupLeaderHandler、ManagerHandler、GeneralManagerHandler,分别实现LeaveHandler接口,并且实现handleRequest方法。 4. 将处理器组合成链,创建一个链式结构的处理器对象,将每个处理器对象的下一个处理器设置为链中的下一个对象。 5. 发送请求,向链中的第一个处理器对象发送请求,请求将沿着链进行处理,直到其中一个处理器对象处理请求为止。 6. 处理请求,每个处理器对象都有机会处理请求,如果一个处理器对象无法处理请求,则将请求传递给链中的下一个处理器对象。 7. 返回响应,当一个处理器对象成功地处理请求时,它可以返回一个响应,响应将沿着链返回给发送者。 具体实现流程如下: 1. 定义请求类LeaveRequest: ```java public class LeaveRequest { private String name; private int days; private String reason; public LeaveRequest(String name, int days, String reason) { this.name = name; this.days = days; this.reason = reason; } // 省略getter和setter方法 } ``` 2. 定义抽象处理类LeaveHandler: ```java public abstract class LeaveHandler { protected LeaveHandler nextHandler; public void setNextHandler(LeaveHandler nextHandler) { this.nextHandler = nextHandler; } public abstract void handleRequest(LeaveRequest request); } ``` 3. 定义具体处理类GroupLeaderHandler、ManagerHandler、GeneralManagerHandler: ```java public class GroupLeaderHandler extends LeaveHandler { @Override public void handleRequest(LeaveRequest request) { if (request.getDays() <= 2) { System.out.println("组长审批:" + request.getName() + "请假" + request.getDays() + "天,理由:" + request.getReason()); } else { if (nextHandler != null) { nextHandler.handleRequest(request); } } } } public class ManagerHandler extends LeaveHandler { @Override public void handleRequest(LeaveRequest request) { if (request.getDays() <= 5) { System.out.println("经理审批:" + request.getName() + "请假" + request.getDays() + "天,理由:" + request.getReason()); } else { if (nextHandler != null) { nextHandler.handleRequest(request); } } } } public class GeneralManagerHandler extends LeaveHandler { @Override public void handleRequest(LeaveRequest request) { if (request.getDays() > 5) { System.out.println("总经理审批:" + request.getName() + "请假" + request.getDays() + "天,理由:" + request.getReason()); } else { if (nextHandler != null) { nextHandler.handleRequest(request); } } } } ``` 4. 将处理器组合成链: ```java public class LeaveApprovalChain { private LeaveHandler firstHandler; public LeaveApprovalChain() { firstHandler = new GroupLeaderHandler(); LeaveHandler managerHandler = new ManagerHandler(); LeaveHandler generalManagerHandler = new GeneralManagerHandler(); firstHandler.setNextHandler(managerHandler); managerHandler.setNextHandler(generalManagerHandler); } public void processRequest(LeaveRequest request) { firstHandler.handleRequest(request); } } ``` 5. 发送请求,处理请求,返回响应: ```java public class Client { public static void main(String[] args) { LeaveApprovalChain chain = new LeaveApprovalChain(); LeaveRequest request1 = new LeaveRequest("张三", 1, "家里有事"); LeaveRequest request2 = new LeaveRequest("李四", 3, "生病了"); LeaveRequest request3 = new LeaveRequest("王五", 7, "参加培训"); chain.processRequest(request1); chain.processRequest(request2); chain.processRequest(request3); } } ``` 运行结果如下: ``` 组长审批:张三请假1天,理由:家里有事 经理审批:李四请假3天,理由:生病了 总经理审批:王五请假7天,理由:参加培训 ``` 以上就是Java责任链模式设计一套流程系统的实现流程,通过责任链模式可以方便地实现多级别的请求处理机制,提高代码的可维护性和可扩展性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值