一 简介
stateless4j 为状态机,可以根据不同触发事件决定下一个状态,适用于当状态字段有许多枚举值,避免状态回退,可以用状态机设置状态的流转,统一管理状态机制。
二 搭建过程
只需要引入依赖即可,如下:
<dependency>
<groupId>com.github.oxo42</groupId>
<artifactId>stateless4j</artifactId>
<version>2.5.0</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
</exclusion>
</exclusions>
</dependency>
说明:
依赖中需要过滤掉slf4j-jdk14的依赖,否则使用的过程会报错
三 如何使用
1 自定义一个状态机
public class AccountHoldStatusMachine {
private static final StateMachineConfig<AccountHoldStatusEnum, AccountHoldAssetTypeEnum> stateMachineConfig = new StateMachineConfig<>();
private final StateMachine<AccountHoldStatusEnum, AccountHoldAssetTypeEnumTrigger> stateMachine;
static{
//初始状态为新客
stateMachineConfig.configure(AccountHoldStatusEnum.NEW)
.ignore(AccountHoldAssetTypeEnumTrigger.EMPTY_ASSET)
.permit(AccountHoldAssetTypeEnumTrigger.HAS_ASSET, AccountHoldStatusEnum.OLD);
//初始状态为流客
stateMachineConfig.configure(AccountHoldStatusEnum.LOSS)
.ignore(AccountHoldAssetTypeEnumTrigger.EMPTY_ASSET)
.permit(AccountHoldAssetTypeEnumTrigger.HAS_ASSET, AccountHoldStatusEnum.OLD);
//初始状态为老客
stateMachineConfig.configure(AccountHoldStatusEnum.OLD)
.permit(AccountHoldAssetTypeEnumTrigger.EMPTY_ASSET, AccountHoldStatusEnum.LOSS)
.ignore(AccountHoldAssetTypeEnumTrigger.HAS_ASSET);
}
public AccountHoldStatusMachine(Integer initHoldStatus){
//初始化状态机初始状态
stateMachine = new StateMachine<>(AccountHoldStatusEnum.getAccountHoldStatusEnumByType(
initHoldStatus), stateMachineConfig);
}
public StateMachine<AccountHoldStatusEnum, AccountHoldAssetTypeEnum> getStateMachine() {
return stateMachine;
}
/**
* 当前触发的事件
* @param trigger
*/
public void fire(AccountHoldAssetTypeEnumTrigger trigger){
this.stateMachine.fire(trigger);
}
2 使用自定义的状态机
//初始化状态机,参数为初始状态
AccountHoldStatusMachine statusMachine = new AccountHoldStatusMachine(oldHoldStatus);
// trigger触发事件
AccountHoldAssetTypeEnum accountHoldAssetTypeEnum = MathUtils.gt(identifiedAssetAmount, BigDecimal.ZERO) ?
AccountHoldAssetTypeEnum.HAS_ASSET : AccountHoldAssetTypeEnum.EMPTY_ASSET;
statusMachine.fire(accountHoldAssetTypeEnum);
//获取事件fire后,下一个状态
Integer newHoldStatus = statusMachine.getStateMachine().getState().getValue();