前言:我用了3天去看责任链模式并且自己调试网上的各种小案例,用了1天把代码敲出来,用了1天进行各种调试。同事看了10分钟,说没看懂,我心想呵呵。我不是说我有多吊炸天,我想说的是别人用时这么多天的成果,你想20分钟就能看懂,除非你是天才或者经验达到了一定水平。那么你就稍微瞄几眼,点个赞,之后可以出门右转了。所以希望你沉下心去看,我花5天,你起码花个一两天吧。相信我,当你看懂了,你会受益匪浅。开始吧!!!

这是一套通用的审核功能,可以扩展你想达到的效果。比如单表审核修改状态,钉钉的审核流程,还有网上Demo里面说的等级范围审核。

首先这里用到的一个设计模式,叫责任链模式。什么是责任链模式,我这里不详细解释,网上写了很多。我直接上两个小案例,希望你可以复制下来跑一下。对后面的实现功能有帮助

案例一

public class Demo {public static void main(String[] args) {Msg msg = new Msg();msg.setM("<01> :) baidu.com 996");FilterChain filterChain = new FilterChain();filterChain.add(new HtmlFilter());filterChain.add(new NumberFileter());filterChain.doFilter(msg);System.out.println(msg.getM());}
}interface Filter{void doFilter(Msg msg);
}class HtmlFilter implements Filter {@Overridepublic void doFilter(Msg msg) {String m = msg.getM();m = m.replace("<","[");m = m.replace(">","]");msg.setM(m);}
}class NumberFileter implements Filter {@Overridepublic void doFilter(Msg msg) {String m = msg.getM();m = m.replace("996","955");msg.setM(m);}
}class FilterChain{List<Filter> list = new ArrayList<>();public void add(Filter filter){list.add(filter);}public void doFilter(Msg msg){for (Filter filter : list) {filter.doFilter(msg);}}
}@Data
class Msg{String m;
}

案例二

public class Demo {public static void main(String[] args) {//领导们Leader500 leader500 = new Leader500();Leader1000 leader1000 = new Leader1000();leader500.setCurrentMoney(500);leader1000.setCurrentMoney(1000);leader500.setSuperiorLeader(leader1000);//申请人Person person = new Person();person.setMoney(1000);leader500.dealInfo(person);}
}/*** 将申请人的操作抽象化  不需要关心是谁来申请出差费用 只关心出差申要做的事*/
abstract class ApplyInfo {int money;public abstract void setMoney(int money);public abstract int getMoney();public void getApply() {System.out.println("老大我需要的出差费用是" + getMoney());}}// 员工要出差
@Data
class Person extends ApplyInfo {@Overridepublic void setMoney(int money) {super.money = money;}@Overridepublic int getMoney() {return super.money;}
}/*** 将领导需要做的事抽象成类*/
@SuppressWarnings("all")
abstract class LeaderInfo {// 当前领导审核的金额int auditMoney;// 当前领导的上级领导LeaderInfo superiorLeader;//设置当前领导能审批的额度public abstract void setCurrentMoney(int money);//设置当前领导的上一级领导public abstract void setSuperiorLeader(LeaderInfo superiorLeader);//当前领导收到申请后处理的事情public abstract void handler(ApplyInfo applyInfo);//执行审批流程public void dealInfo(ApplyInfo applyInfo) {if (applyInfo.money <= auditMoney) {handler(applyInfo);} else {superiorLeader.dealInfo(applyInfo);}}
}/*** 申请500已下的金额可以批,大于500会向上级回报*/
class Leader500 extends LeaderInfo {@Overridepublic void setCurrentMoney(int money) {super.auditMoney = money;}@Overridepublic void handler(ApplyInfo applyInfo) {applyInfo.getApply();System.out.println("我是Leader500  你需要申请的" + applyInfo.getMoney() + "我批准了");}@Overridepublic void setSuperiorLeader(LeaderInfo superiorLeader) {super.superiorLeader = superiorLeader;}
}/*** 申请1000已下的金额可以批,大于500会向上级回报*/
class Leader1000 extends LeaderInfo {@Overridepublic void setCurrentMoney(int money) {super.auditMoney = money;}@Overridepublic void handler(ApplyInfo applyInfo) {applyInfo.getApply();System.out.println("我是Leader1000  你需要申请的" + applyInfo.getMoney() + "我批准了");}@Overridepublic void setSuperiorLeader(LeaderInfo superiorLeader) {super.superiorLeader = superiorLeader;}
}

案例流程有了,上我的结晶成果。我就不解释,代码都有注释。里面有些是公司业务的字段和逻辑处理。不建议复制用到你们的业务处理,你主要是看逻辑和思想,当你看懂逻辑和思想,你可以照葫芦画瓢。

流程处理图:

一:审核枚举类

public enum AuditTypeEnum {/***审核类型*/GD("GD", "工单"),FW("FW", "范围"),JY("JY", "借阅"),;@EnumValueprivate final String code;private final String label;
}

二:前端请求实体类

@Data
public abstract class AuditInfo {@ApiModelProperty("id")private String id;@ApiModelProperty("审核类型")private AuditTypeEnum type;@ApiModelProperty("审批状态")")private ApproveStatusEnum approvalStatus;
}
@Data
@ApiModel("通用审核参数")
public class AuditDTO extends AuditInfo {}

三:controller层

public class AuditController {@Autowiredprivate AuditServiceImpl auditService;@PostMapping("audit")public RestResult<String> audit(@Validated @RequestBody AuditDTO auditDTO){return auditService.audit(auditDTO);}
}

四:serviceSmlp层

public class AuditServiceImpl {@Autowiredprivate WorkAuditChain workChain;public RestResult<String> audit(AuditDTO auditDTO) {// 给审核设置审核类型workChain.setType(AuditTypeEnum.GD);FilterChain filterChain = new FilterChain();// 给审核设置审核类型filterChain.setType(AuditTypeEnum.FW);AAChain aaChain = new AAChain();ABChain abChain = new ABChain();ACChain acChain = new ACChain();// 把一个个得子链放到其中一个主链节点当中filterChain.add(aaChain).add(abChain).add(acChain);// 每个主链节点连成一条链workChain.setNextAuditChain(filterChain);// 如果还有其它主链节点可以继续拼接(如果没有其它主链节点,下面这句可有可无)filterChain.setNextAuditChain(null);return workChain.dealInfo(auditDTO);}
}

五:基本的一些接口

public interface Chain {// 功能描述 : 设值审核类型void setType(AuditTypeEnum type);// 功能描述 : 设置下一个处理者void setNextAuditChain(Chain nextChain);// 功能描述 :处理审核信息Boolean handle(AuditInfo auditInfo);// 功能描述 : 处理审核流程RestResult<String> dealInfo(AuditInfo auditInfo);
}
// 处理工单审核接口
public abstract class AuditChain implements Chain{// 审核类型protected AuditTypeEnum type;// 下一个处理者protected Chain nextChain;@Overridepublic void setType(AuditTypeEnum type) {this.type = type;}@Overridepublic void setNextAuditChain(Chain nextChain) {this.nextChain = nextChain;}// 处理审核流程@Overridepublic RestResult<String> dealInfo(AuditInfo auditInfo){if(type.equals(auditInfo.getType())){handle(auditInfo);}else{if(ObjectUtil.isNotNull(nextChain)){nextChain.dealInfo(auditInfo);}else{return RestResult.fail("没有给链条设置审核类型");}}return RestResult.success();}
}

六:实现类

// 工单审核实现类
public class WorkAuditChain extends AuditChain {private final WorkorderMapper workorderMapper;@Overridepublic Boolean handle(AuditInfo auditInfo) {Workorder workorder = new Workorder();workorder.setApprovalStatus(auditInfo.getApprovalStatus()).setApprovalUsrId(currUser.getId());int update = workorderMapper.updateById(workorder);return update != 0 ;}
}
// 处理范围审核(就是案例二)
public class FilterChain implements Chain{// 子链集合List<Chain> list = new ArrayList<>();// 链式编程public FilterChain add(Chain chain){list.add(chain);return this;}// 审核类型protected AuditTypeEnum type;// 下一个处理者protected Chain nextChain;@Overridepublic void setType(AuditTypeEnum type) {this.type = type;}@Overridepublic void setNextAuditChain(Chain nextChain) {this.nextChain = nextChain;}@Overridepublic Boolean handle(AuditInfo auditInfo) {return true;}// 处理审核流程@Overridepublic RestResult<String> dealInfo(AuditInfo auditInfo){if(type.equals(auditInfo.getType())){// 执行子链逻辑for (Chain chain : list) {Boolean handle = chain.handle(auditInfo);if(!handle){return RestResult.success();}}}// 执行下一个主链if(ObjectUtil.isNotNull(nextChain)){nextChain.dealInfo(auditInfo);}return RestResult.success();}
}
// 子链接
public class AAChain extends FilterChain {@Overridepublic Boolean handle(AuditInfo auditInfo) {System.out.println("AAChain");return true;}
}
// 子链接
public class ABChain extends FilterChain {@Overridepublic Boolean handle(AuditInfo auditInfo) {System.out.println("ABChain");return false;}
}
// 子链接
public class ACChain extends FilterChain {@Overridepublic Boolean handle(AuditInfo auditInfo) {System.out.println("ACChain");return true;}
}

以上是我自已写的一套,希望能给你有一个小小的启发。如有大神,可以指点一二。如果有问题,留言我会有空的时候回复。不喜勿喷。。。

责任链模式实现审核功能相关推荐

  1. 一篇文章搞懂Java设计模式之责任链模式

    简述: 前端时间再看一些类库的源码,发现责任链模式的强大之处,尤其是和建造者模式的结合后强大的动态可扩展性更是牛逼的一塌糊涂.接下来赶紧了解一下吧! 我们先来了解一下什么是责任链模式: 职责链模式(C ...

  2. java工作流 责任链模式 审核审批流程 方法二

    因为最近在搞一些工作流的事情,而传统的Activity等工作流又太重,不太适合我们的系统,所以在网上找到了Apache Commons Chain这个实现比较轻的Command模式与责任链模式结合的工 ...

  3. [转]《JAVA与模式》之责任链模式

    http://www.cnblogs.com/java-my-life/archive/2012/05/28/2516865.html 在阎宏博士的<JAVA与模式>一书中开头是这样描述责 ...

  4. 《JAVA与模式》之责任链模式

    2019独角兽企业重金招聘Python工程师标准>>> 详细请访问原博客:http://www.cnblogs.com/java-my-life/archive/2012/05/28 ...

  5. 《java设计模式》之责任链模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...

  6. 行为型设计模式(1)—— 责任链模式(Chain of Responsibility Pattern)

    文章目录 1.简介 2.使用场景 3.示例 4.变种 参考文献 1.简介 经常听身边的同事说其在项目中用到了责任链模式,今天就来学习一下什么是责任链模式. 责任链模式(Chain of Respons ...

  7. 【手写源码-设计模式15】-责任链模式-基于人事请假单工作流场景

    1:主题拆解 ①基本介绍 ②人事请假单工作流模拟 ③责任链模式的优缺点 ④适用场景 ⑤应用实例 ⑥ASP.NET 管道模型 2:基本介绍 责任链模式很像异常的捕获和处理,当一个问题发生的时候,当前对象 ...

  8. 手撸设计模式之-责任链模式

    手撸设计模式之-责任链模式 一 .责任链模式介绍 1.1 定义 1.2 责任链模式UML结构图 1.3 责任链模式结构详细 1.3 用例代码实现 二.责任链模式应用场景: 2.1 场景概述 2.2 场 ...

  9. 责任链模式(以及变种管道模式)的应用案例

    目录 一.前言 二.责任链简单使用 场景说明 1.前置代码准备 2.基本接口定义 3.业务节点处理代码 活动时效性检验 活动价格管控 活动风控校验 4.业务代码 5.测试与结果展示 测试代码 结果展示 ...

最新文章

  1. Java项目:宠物医院预约挂号系统(java+JSP+Spring+SpringBoot+MyBatis+html+layui+maven+Mysql)
  2. 关于 synchronizeOnSession
  3. 2008台北英特尔信息技术峰会主题演讲精选-王文汉
  4. IntelliJ IDEA for Mac 如何创建普通的Java项目_创建项目_新建项目
  5. 信息学奥赛一本通(1408:素数回文数的个数)
  6. PHP正则表达式及实例
  7. oracle hibernate 自动创建表,自动创建表时,多了一张表hibernate_sequence,为什么?
  8. 【渝粤教育】国家开放大学2018年秋季 0109-22T公司财务 参考试题
  9. Oracle 学习笔记(Windows 环境下安装 + PL/SQL)
  10. “win+PrtSc”图片没有保存到图片文件夹中的问题
  11. ps一点等于多少厘米_PS像素与厘米之间的转换
  12. 360wifi: 手机锁屏360wifi掉线的解决方法
  13. 计算机的第一道安全防线是,网络安全的第一道防线是
  14. 【计算机网络】学习笔记
  15. 错题集:HDLBits lfsr5 Galois型lfsr
  16. Vue.extend构造器
  17. ISTQB FL初级认证系列02:ISTQB FL初级认证考试攻略
  18. qml的focus问题
  19. FastAdmin 系统配置的使用
  20. #BDA#笔记#业务知识:基础商业常识

热门文章

  1. Day 195/200 Vue3 项目使用CDN加速
  2. Html5+javascript中国象棋 制作过程中用到的一些AI算法
  3. 万用表怎么测电池内阻_请问我用万用表如何测量电池内阻?
  4. iOS多任务(iPad分屏模式)
  5. 4. 列表一学完,Python 会一半,滚雪球学 Python
  6. Potplayer安装 之 视频编解码器
  7. 智能优化算法-菲克定律算法Fick‘s Law Algorithm(附Matlab代码)
  8. 别再让投稿信耽误你发稿啦!(附cover letter模板)
  9. WORD保存文件时,内存不足,是否存为挽救文档
  10. Springboot毕设项目美容院管理系统33877(java+VUE+Mybatis+Maven+Mysql)