设计模式-请假流程-责任链模式
作者:互联网
责任链模式的定义
首先我们可以先看一下责任链模式的定义:
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.(使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。)
责任链模式的通用类图(觉得不好理解的可以跳过往下看)
下面我们再看一下责任链模式定义的通用的类图是什么样子的,这里我是参考的《设计模式之禅》中描述的类图,看着是不是非常的简单啊。
这里说明一下,上面所说的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);
}
请假流程逻辑说明
假设让我们实现一个请假流程的功能,请假的业务规则如下所示:
一个员工进行请假的话,如果是1天以内(包含一天),直接小组长进行审批就可以了。如果是大于1天小于3天,流程继续向下走,需要部门经理进行批准,如果请假天数超过3天以上CTO审批。
这个流程还是非常好理解的,就是一个链式的流程结构,如果符合某些规则就会请求继续往下一个节点执行。
责任链模式实现请假流程处理流程图
实现请假流程操作的流程图如上图所示,Approvehandler是抽象的审批流程处理者,doHandler(int)方法是对请假天数(传参就是请假天数,方便理解,尽量方法简单)的一个逻辑处理方法;next方法是用来作为传入下一个节点的对象,我们可以参考一下链表的Node对象就明白了,里面变量也有next、pro类型都是Node类型的!
下面的Handler的实现类GroupLeaderApproveHandler、DepartLeaderApproveHandler、CTOApproveHandler相对来说好理解一些,直接实现自己的处理的逻辑就可以了。
然后就是我们的调用方的使用EmployeeClient,我们只需要创建好请假方法,在里面初始化好对应的处理者节点,然后调用doHandler方法就可以了。
责任链模式请假流程代码实现
idea中代码设计的diagram类图如下所示:
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也就是数据转换或者说是数据处理,这个数据处理的过程有数据清洗、提取、标识、关联等操作环节,而且特点是顺序不是固定的,而是允许我们任意组装,这种场景是非常适合使用责任链模式的,当然中间还夹杂着其他设计模式的使用。
标签:请假,ApproveHandler,处理,流程,request,设计模式,public,size 来源: https://blog.csdn.net/qq_35657299/article/details/120720877