状态机实现
1.状态机的实现:
2.状态机的转化图如下:
假设有一个任务,其在流程中经历了3个节点的状态图。每个业务流程中不同的状态。
在不同的流程中执行不同的任务,当有不同的事件进行触发时,进行状态转化。
路径名 | 事件名称 |
1 | 过期时间 |
2 | 循环提交 |
3 | 提交Ok |
4 | 验证失败 |
5 | 加入黑名单 |
因此代码如下:
public enum State010 implements IState {
TASK_READY {
@Override
public boolean change(IState target, Map<String, Boolean> flags, IContext context) throws FlagMissedException, UnexpectedTargetStateException, UnrecognizedTaskStateException {
boolean isStart = getFlag(Constants.FLAG_IS_START, flags);
// self change
if (isStart) {
context.State(TASK_START);
return false;
}
return true;
}
},
TASK_START {
@Override
public boolean change(IState target, Map<String, Boolean> flags, IContext context) throws FlagMissedException, UnexpectedTargetStateException, UnrecognizedTaskStateException {
boolean isStart = getFlag(Constants.FLAG_IS_START, flags);
boolean isEnd = getFlag(Constants.FLAG_IS_END, flags);
boolean isOut = getFlag(Constants.FLAG_IS_OUT, flags);
boolean isExist = getFlag(Constants.FLAG_IS_EXIST, flags);
// self change
if (!isStart) {
context.State(TASK_READY);
return false;
}
if (isEnd || !isExist) {
context.State(TASK_EXPIRED);
return false;
}
if (isOut) {
context.State(TASK_OUT);
return false;
}
if (target != null) {
// user change
isExpectedTargets(target, FILE_UPLOAD);
context.State(target);
}
return true;
}
},
TASK_OUT {
@Override
public boolean change(IState target, Map<String, Boolean> flags, IContext context) throws FlagMissedException, UnexpectedTargetStateException, UnrecognizedTaskStateException {
// self change
boolean isExist = getFlag(Constants.FLAG_IS_EXIST, flags);
boolean isEnd = getFlag(Constants.FLAG_IS_END, flags);
boolean isOut = getFlag(Constants.FLAG_IS_OUT, flags);
if (!isExist || isEnd) {
context.State(TASK_EXPIRED);
return false;
}
if (!isOut) {
context.State(TASK_READY);
return false;
}
return true;
}
},
TASK_EXPIRED {
@Override
public boolean change(IState target, Map<String, Boolean> flags, IContext context) throws UnexpectedTargetStateException, UnrecognizedTaskStateException, FlagMissedException {
boolean isEnd = flags.get(Constants.FLAG_IS_END);
boolean isExist = getFlag(Constants.FLAG_IS_EXIST, flags);
if (!isEnd && isExist) {
context.State(TASK_READY);
return false;
}
if (target != null) {
isExpectedTargets(target, TASK_READY);
}
return true;
}
},
TASK_COMPLETED {
@Override
public boolean change(IState target, Map<String, Boolean> flags, IContext context) throws UnexpectedTargetStateException, UnrecognizedTaskStateException {
if (target != null) {
isExpectedTargets(target, null);
}
return true;
}
},
FILE_UPLOAD {
@Override
public boolean change(IState target, Map<String, Boolean> flags, IContext context) throws UnexpectedTargetStateException, UnrecognizedTaskStateException {
if (target != null) {
isExpectedTargets(target, VERIFY_FAIL, VERIFY_SUCCESS, TASK_START, BLACK_LIST);
context.State(target);
}
return true;
}
},
VERIFY_FAIL {
@Override
public boolean change(IState target, Map<String, Boolean> flags, IContext context) throws FlagMissedException, UnexpectedTargetStateException, UnrecognizedTaskStateException {
// self change
boolean isEnd = getFlag(Constants.FLAG_IS_END, flags);
boolean isExisted = getFlag(Constants.FLAG_IS_EXIST, flags);
if (isEnd || !isExisted) {
context.State(TASK_EXPIRED);
return false;
}
if (target != null) {
// user change
isExpectedTargets(target, FILE_UPLOAD);
context.State(target);
}
return true;
}
},
VERIFY_SUCCESS {
@Override
public boolean change(IState target, Map<String, Boolean> flags, IContext context) throws UnexpectedTargetStateException, UnrecognizedTaskStateException {
if (target != null) {
isExpectedTargets(target, TASK_COMPLETED, FILE_UPLOAD);
context.State(target);
}
return true;
}
},
BLACK_LIST {
@Override
public boolean change(IState target, Map<String, Boolean> flags, IContext context) throws FlagMissedException, UnexpectedTargetStateException, UnrecognizedTaskStateException {
if (target != null) {
isExpectedTargets(target, TASK_READY, FILE_UPLOAD);
context.State(target);
}
return true;
}
};