流程审批

在实际的项目中,我们经常会涉及到某个对象实体的状态转换,比如合同审批,请假审批,订单流程状态流转,由于本文不涉及工作流(Activiti,Zeebe)的介绍,只是介绍职责链模式的设计模式,因此我们只涉及状态的简单变更。

场景描述

张总是一家大型电商公司的老总,每天都会有很多店铺,零售合同等着他审批,在审批之前他都会先经过法务、财务等部门主管的审批,基本过程为:跟进人添加合同相关字段数据,合同状态为待提交,等跟进人确认提交了合同后,合同变为待审核,若被取消,则变为已取消;接着由多级部门审批,审批通过为待签署,若被驳回,则变回为待审核状态,若签署过后,则为已完成,若合同不续约,则为已终止

上面场景的描述,可能比较拗口,我将他们的状态流转画成流程图,看下方:

       我们在做页面交互的时候,其实对应着按钮也有几个状态,我们需要对应按钮的状态来判断当前用户执行的操作,为此我们也需要按钮的拒绝、确认、作废三个状态。

具体代码

职责链的核心思想是,把代码串成一条完整的调用链条,我们在平时的业务开发中,经常涉及处理过程,有了职责链模式,我们可以随时增加或修改一个请求的结构,增强了对象指派的灵活性,但要注意的是,一个请求极有可能到了链的末端都得不到处理,或者因为没有正确的配置而得不到处理,因此需要做一些极端情况的处理。

       ButtonStatus.java

/*** 合同审批场景:合同新建* @author dzx * @since 2020/5/8*/
public enum  ButtonStatus {/*** 拒绝*/REJECT,/*** 确认*/CONFIRM,/*** 作废*/VOID
}

       ContractChainStatus .java

/*** Description:* <p>*     合同状态* </p>* @author dzx* @date 2020/5/8 20:56*/
public enum ContractChainStatus {/*** 待提交*/TO_BE_SUBMIT{@Overridepublic ContractChainStatus nextStatus(){return TO_BE_AUDIT;}@Overridepublic ContractChainStatus voidStatus(){return CANCEL;}},/*** 待审核*/TO_BE_AUDIT{@Overridepublic ContractChainStatus nextStatus() {return TO_BE_SIGN;}@Overridepublic ContractChainStatus preStatus() {return TO_BE_SUBMIT;}},/*** 待签署*/TO_BE_SIGN{@Overridepublic ContractChainStatus nextStatus() {return COMPLETED;}},/*** 已取消*/CANCEL,/*** 已完成*/COMPLETED{@Overridepublic ContractChainStatus nextStatus() {return TERMINATED;}},/*** 已终止*/TERMINATED;//以下方法将被以上的枚举内部类覆盖public ContractChainStatus nextStatus(){throw new RuntimeException("没有下一个状态");}public ContractChainStatus preStatus(){throw new RuntimeException("前一个状态");}public ContractChainStatus voidStatus(){throw new RuntimeException("取消状态");}}

可以看出,部分状态才有下一个状态与上一个状态,当没有该状态的时候就会抛出异常,这里使用了枚举特性,巧妙的链式调用了重写方法,具体调用过程:

       ContractChainStatus .java

/*** 获取相关合同状态节点* @param auditStatus 操作状态* @param contractStatus 合同状态* @exception ContractException 业务异常,此处为自定义业务异常* @return ContractStatus 合同状态枚举*/public ContractStatus getContractStatus(ButtonStatus buttonStatus ,ContractStatus contractStatus) throws ContractException{switch (buttonStatus){//前端接收状态:确认case CONFIRM:return contractStatus.nextStatus();//前端接收状态:拒绝case REJECT:return contractStatus.preStatus();//前端接收状态:作废case VOID:return contractStatus.voidStatus();default://500204104表业务编码,抛出业务异常throw new ContractException(500204104, "当前审批节点不允许该操作");}}

设计模式|职责链模式--流程状态审批(枚举实现)相关推荐

  1. Python设计模式-职责链模式

    Python设计模式-职责链模式 代码基于3.5.2,代码如下; #coding:utf-8 #职责链模式class Handler():def __init__(self):self.success ...

  2. 第二十章 Caché 设计模式 职责链模式

    文章目录 第二十章 Caché 设计模式 职责链模式 定义 优点 缺点 结构图 描述 完整示例 请求类 抽象责任类 实现责任类 调用 思考 第二十章 Caché 设计模式 职责链模式 定义 使多个对象 ...

  3. 设计模式---职责链模式(Chain of Responsibility Pattern)

    目录 1.学校 OA系统采购审批需求 2.传统方式解决审批流程 3.传统 方式 问题分析 4.职责链模式基本介绍 5.职责链模式原理类图 6.职责链模式解决OA采购审批 7.职责链模式在SpringM ...

  4. 常用设计模式——职责链模式

    目录 前言 1.职责链模式的定义与特点 2.职责链模式的结构与实现 2.1 模式的结构 2.2 模式的实现 前言 在现实生活中,一个事件需要经过多个对象处理是很常见的场景.例如,采购审批流程.请假流程 ...

  5. 设计模式——职责链模式(附代码示例)

    一. 传统方式 以学校采购审批为例,不同金额的采购需要不同人员的审批 1. 传统方式解决 收到请求后,通过不同的金额调用对应的审批方法 2. 传统方式存在问题 Client会使用到分支判断(比如swi ...

  6. golang设计模式——职责链模式

    职责链模式 目录 职责链模式 分析 应用场景 代码实现 实例 代码 单元测试 Gin 的中间件实现 总结 职责链将处理模块串联成链,请求沿着链条被处理,提供了很好的扩展性,而且能够去掉if-else. ...

  7. 趣谈设计模式 | 职责链模式(ChainOfResposibility):请求的转发处理

    文章目录 案例:企业信息处理 职责链模式 总结 完整代码与文档 案例:企业信息处理 对于一个企业来说,每天难免的要收到大量的信息,有求职者发送过来的简历.其他公司的商务合作信息.又或者是和一些企业或客 ...

  8. C++设计模式-职责链模式

    目录 基本概念 代码与实例 在哪种地方使用 基本概念 职责链模式(Chain of Responsibility):时多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这个对象连 ...

  9. JAVA 设计模式 职责链模式

    用途 职责链模式 (Chain Of Responsibility) 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系. 将这个对象连成一条链,并沿着这条链传递该请求,直到有一个 ...

最新文章

  1. python aipspeech_Python调用百度API实现语音识别(二)
  2. 【Boost】boost库asio详解2——io_service::run函数无任务时退出的问题
  3. listview 滑动更改标题
  4. scrapy笔记——python的时间转换
  5. C语言-第8课 - 注释符号
  6. 全球数据库--基金/管理产品--分类/行业平均
  7. Win8 Metro(C#)数字图像处理--2.40二值图像轮廓提取算法
  8. 机器人布罩_机器人防护罩的主要作用是什么?
  9. sqlite3:unique constraint failed xxx Frame.No
  10. python IDE 集合
  11. 记一次服务器被攻击事件
  12. winform c# chart控件添加边界值线条以及扩展性功能
  13. AWWWB.COM网站克隆器
  14. 无心剑中译莎士比亚诗20首
  15. 百度网盘四种方法免费提速
  16. 亲测解决知网下载的正版国家标准打开不了
  17. 苹果手机怎么把游戏隐藏在计算机,iphone苹果手机怎么隐藏应用和游戏图标?
  18. C++ GUI Programming with Qt4 Second Edition 之 附录A.2 Windows系统Qt的安装
  19. expand linux,Expand和Unexpand命令在Linux下的使用示例
  20. studio升级后butterknife神坑

热门文章

  1. 如何升级Windows 11正式版?四种方案都在这里了
  2. java密码框转字符串_实现汉字的凯撒密码(内容包括:去掉字符串中的转义字符、汉字的unicode转换)...
  3. echarts 图例 两行展示
  4. mysql rls_各种类型RLS自适应滤波算法的C++实现
  5. 基于Yolov5的草莓病虫害检测识别
  6. 【c#】DGV中复制粘贴数据最详细代码
  7. uniCloud开发公众号:一、接收、解析、组装xml消息
  8. 中小企业的公司财务管理系统
  9. 数据库Java项目:在线租房出租房屋系统(java+springboot+maven+mysql)
  10. 【SolidWorks】模型状态显示设置介绍