状态机实现

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;
        }
    };