设计模式|职责链模式--流程状态审批(枚举实现)
流程审批
在实际的项目中,我们经常会涉及到某个对象实体的状态转换,比如合同审批,请假审批,订单流程状态流转,由于本文不涉及工作流(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, "当前审批节点不允许该操作");}}
设计模式|职责链模式--流程状态审批(枚举实现)相关推荐
- Python设计模式-职责链模式
Python设计模式-职责链模式 代码基于3.5.2,代码如下; #coding:utf-8 #职责链模式class Handler():def __init__(self):self.success ...
- 第二十章 Caché 设计模式 职责链模式
文章目录 第二十章 Caché 设计模式 职责链模式 定义 优点 缺点 结构图 描述 完整示例 请求类 抽象责任类 实现责任类 调用 思考 第二十章 Caché 设计模式 职责链模式 定义 使多个对象 ...
- 设计模式---职责链模式(Chain of Responsibility Pattern)
目录 1.学校 OA系统采购审批需求 2.传统方式解决审批流程 3.传统 方式 问题分析 4.职责链模式基本介绍 5.职责链模式原理类图 6.职责链模式解决OA采购审批 7.职责链模式在SpringM ...
- 常用设计模式——职责链模式
目录 前言 1.职责链模式的定义与特点 2.职责链模式的结构与实现 2.1 模式的结构 2.2 模式的实现 前言 在现实生活中,一个事件需要经过多个对象处理是很常见的场景.例如,采购审批流程.请假流程 ...
- 设计模式——职责链模式(附代码示例)
一. 传统方式 以学校采购审批为例,不同金额的采购需要不同人员的审批 1. 传统方式解决 收到请求后,通过不同的金额调用对应的审批方法 2. 传统方式存在问题 Client会使用到分支判断(比如swi ...
- golang设计模式——职责链模式
职责链模式 目录 职责链模式 分析 应用场景 代码实现 实例 代码 单元测试 Gin 的中间件实现 总结 职责链将处理模块串联成链,请求沿着链条被处理,提供了很好的扩展性,而且能够去掉if-else. ...
- 趣谈设计模式 | 职责链模式(ChainOfResposibility):请求的转发处理
文章目录 案例:企业信息处理 职责链模式 总结 完整代码与文档 案例:企业信息处理 对于一个企业来说,每天难免的要收到大量的信息,有求职者发送过来的简历.其他公司的商务合作信息.又或者是和一些企业或客 ...
- C++设计模式-职责链模式
目录 基本概念 代码与实例 在哪种地方使用 基本概念 职责链模式(Chain of Responsibility):时多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这个对象连 ...
- JAVA 设计模式 职责链模式
用途 职责链模式 (Chain Of Responsibility) 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系. 将这个对象连成一条链,并沿着这条链传递该请求,直到有一个 ...
最新文章
- python aipspeech_Python调用百度API实现语音识别(二)
- 【Boost】boost库asio详解2——io_service::run函数无任务时退出的问题
- listview 滑动更改标题
- scrapy笔记——python的时间转换
- C语言-第8课 - 注释符号
- 全球数据库--基金/管理产品--分类/行业平均
- Win8 Metro(C#)数字图像处理--2.40二值图像轮廓提取算法
- 机器人布罩_机器人防护罩的主要作用是什么?
- sqlite3:unique constraint failed xxx Frame.No
- python IDE 集合
- 记一次服务器被攻击事件
- winform c# chart控件添加边界值线条以及扩展性功能
- AWWWB.COM网站克隆器
- 无心剑中译莎士比亚诗20首
- 百度网盘四种方法免费提速
- 亲测解决知网下载的正版国家标准打开不了
- 苹果手机怎么把游戏隐藏在计算机,iphone苹果手机怎么隐藏应用和游戏图标?
- C++ GUI Programming with Qt4 Second Edition 之 附录A.2 Windows系统Qt的安装
- expand linux,Expand和Unexpand命令在Linux下的使用示例
- studio升级后butterknife神坑
热门文章
- 如何升级Windows 11正式版?四种方案都在这里了
- java密码框转字符串_实现汉字的凯撒密码(内容包括:去掉字符串中的转义字符、汉字的unicode转换)...
- echarts 图例 两行展示
- mysql rls_各种类型RLS自适应滤波算法的C++实现
- 基于Yolov5的草莓病虫害检测识别
- 【c#】DGV中复制粘贴数据最详细代码
- uniCloud开发公众号:一、接收、解析、组装xml消息
- 中小企业的公司财务管理系统
- 数据库Java项目:在线租房出租房屋系统(java+springboot+maven+mysql)
- 【SolidWorks】模型状态显示设置介绍