状态流使用原创
# 状态流使用
# 概要
提示
状态流是业务对象DTO的状态流转,通过一个功能Action从一个状态转化为另一个状态!
业务对象在流转过程中存在各种状态,通过业务逻辑处理,从一个状态变更为另一个状态,在操作的过程中需要频繁的判断能否流转到另一个状态,流转是否合法,该状态下是否允许删除,是否允许更新等逻辑嵌入到业务中,使项目难以维护。为此通过状态流来解决业务对象流转的状态难题。
# 组成
状态流由以下几部分组成
- 初始状态 对象初始化时的状态
- 可编辑状态列表
- 可删除状态列表
- 多个流程,每个流程由 一个原始状态,一个目的状态,一个动作组成,即通过这个动作由原始状态转化为目的状态
# 构建状态流
构建状态流需要以下几个步骤
- 创建Action枚举值、State枚举值
- 在dto中继承StateProcess,设定状态和动作的枚举值
- 实现initProcess方法,在此方法中进行状态流的构建
@Override
public Process<DictionaryState, DictionaryAction> initProcess() {
return getBuilder().actions(EnumSet.allOf(DictionaryAction.class)).states(EnumSet.allOf(DictionaryState.class))
.initState(DictionaryState.ACTIVE).editable(EnumSet.of(DictionaryState.ACTIVE, DictionaryState.STOPPED)).deleteable(EnumSet.of(DictionaryState.ACTIVE, DictionaryState.STOPPED))
.process().source(DictionaryState.STOPPED).target(DictionaryState.ACTIVE).action(DictionaryAction.USE)
.and()
.process().source(DictionaryState.ACTIVE).target(DictionaryState.STOPPED).action(DictionaryAction.STOP)
.build();
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
解释如下:
- 字典状态流绑定DictionaryState状态枚举和DictionaryAction动作
- 状态流初始状态为ACTIVE,可编辑状态为ACTIVE、STOPPED,可删除状态为ACTIVE,STOPPED
- 从ACTIVE到STOPPED状态需要执行STOP动作
- 从STOPPED到ACTIVE状态需要执行USE动作
# 状态流的使用
- 初始化状态调用 StateWorkFlow.doInitState(dto);
- 判断在当前状态下是否可删除、是否可编辑调用方法为StateWorkFlow.doAssertDelete(dto)、StateWorkFlow.doAssertEdit(dto)
- 状态变更执行流程为 StateWorkFlow.doProcess(dto,action);