IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 责任链模式多级审批 -> 正文阅读

[Java知识库]责任链模式多级审批

作者:recommend-item-box type_blog clearfix

不同请假天数需要不同级别人员审核,所以将不同处理类定义成一个责任链

1、责任链执行抽象类

编写过滤责任链执行抽象类AbstractExecuteFilter.java

public abstract class AbstractExecuteFilter {
    //ThreadLocal存储key
    public static final String SLOT_KEY = "LeaveRequest";
    //下一个拦截
    protected AbstractExecuteFilter nextFilter;
    //存储参数
    public static ThreadLocal<Map<String, Object>> localMap = new ThreadLocal<>();
    public void addNextFilter(AbstractExecuteFilter filter) {
        this.nextFilter = filter;
    }
    public abstract boolean execute();
    /**直接主管审批处理的请假天数*/
    protected int MIN = 1;
    /**部门经理处理的请假天数*/
    protected int MIDDLE = 3;
    /**总经理处理的请假天数*/
    protected int MAX = 30;
}

编写参数传递类(请假类):

@Builder
public class LeaveRequest {
    /**天数*/
    private int leaveDays;
    /**姓名*/
    private String name;
}

2、设置上下文环境获取bean

根据不同的filters名动态获取对象,ExecuteFilterLoader实现ApplicationContextAware接口,

@Slf4j
@Component
public class ExecuteFilterLoader implements ApplicationContextAware {

    public static ApplicationContext applicationContext;
    /**
     * 加载规则执行链
     * 实现ApplicationContextAware接口的回调方法,设置上下文环境
     * @param applicationContext spring上下文对象
     * @throws BeansException 抛出spring异常
     */
    public static AbstractExecuteFilter loadExecuteFilter(List<String> filters) {
        if (CollectionUtils.isEmpty(filters)) {
            throw BusinessException.asBusinessException(BusinessErrorCode.ILLEGAL_ARG_ERROR);
        }
        AbstractExecuteFilter filter = null;
        AbstractExecuteFilter next = null;
        for (String filterName : filters) {
            AbstractExecuteFilter bean = (AbstractExecuteFilter) applicationContext.getBean(filterName);
            if (null == next) {
                filter = bean;
            } else {
                next.addNextFilter(bean);
            }
            next = bean;
        }
        return filter;
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        ExecuteFilterLoader.applicationContext = applicationContext;
    }
}

3、不同处理类扩展 AbstractLeaveHandler

创建三种类型的审批处理,都继承了 AbstractLeaveHandler抽象类:

/**
* 直接领导处理
*/
@Slf4j
@Component("directLeaderLeaveHandler")
public class DirectLeaderLeaveHandler extends AbstractLeaveHandler {
    @Override
    public void execute() {
        int leaveDays = (int) localMap.get().get("leaveDays");
        if(leaveDays <= this.MIN){
            System.out.println("直接主管已经处理;流程结束。");
            return;
        }
        if(null != this.nextFilter){
            this.nextFilter.execute();
        }else{
            System.out.println("审批拒绝!");
        }
    }
}

/**
* 部门领导处理
*/
@Slf4j
@Component("deptManagerLeaveHandler")
public class DeptManagerLeaveHandler extends AbstractLeaveHandler {
    @Override
    public void execute() {
        int leaveDays = (int) localMap.get().get("leaveDays");
        if(leaveDays >this.MIN && leaveDays <= this.MIDDLE){
            System.out.println("部门经理已经处理;流程结束。");
            return;
        }
        if(null != this.nextFilter){
            this.nextFilter.execute();
        }else{
            System.out.println("审批拒绝!");
        }
    }
}



/**
* 总经理处理
*/
@Slf4j
@Component("gManagerLeaveHandler")
public class GManagerLeaveHandler extends AbstractLeaveHandler {
    @Override
    public void execute() {
        int leaveDays = (int) localMap.get().get("leaveDays");
        if(leaveDays > this.MIDDLE && leaveDays <= this.MAX){
            System.out.println("总经理已经处理;流程结束。");
            return;
        }
        if(null != this.nextFilter){
            this.nextFilter.execute();
        }else{
            System.out.println("审批拒绝!");
        }
    }
}

4、调用

(新员工请假20天谁审批):

//要处理的责任链(直接领导、部门领导、总经理审批)
String filterConfig="directLeaderLeaveHandler,deptManagerLeaveHandler,gManagerLeaveHandler";
//入参
LeaveRequest request = LeaveRequest.builder().leaveDays(20).name("新员工").build();
//不同责任链类间通过ThreadLocal参数传递
Map<String, Object> localMap = new HashMap<>();
localMap.put(AbstractExecuteFilter.SLOT_KEY,request);
AbstractExecuteFilter.localMap.set(localMap);//传递参数
ExecuteFilterLoader.loadExecuteFilter(Arrays.asList(filterConfig.split(","))).execute();

运行结果:总经理已经处理;流程结束。

小结:调用了审批链不同环节的处理,应用责任链模式进行解耦,增强给对象指派职责的灵活性。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-03-30 18:09:58  更:2022-03-30 18:13:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 6:24:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码