状态机模式的设计与实现

概述:状态机工作流由一组状态组成。一个状态被指示为初始状态。每个状态都可以接收一组特定事件。视事件而定,可以转换到另一个状态。状态机工作流可以有最终状态。当转换到最终状态时,工作流将完成。

状态机把整个复杂的过程分成若干个状态,一个状态执行完毕后,进入下一个状态。相同的事件在不同的状态下,执行操作也会不同。下面是状态机流程图样例 输入图片说明 工作流可以自动进入下一个状态(根据你的业务逻辑),也可以由用户指定(procScanEvent)

下面请看具体的代码实现:

public class ScanStateMachine {
    private State mState = State.INITIAL;

    public enum State {
        /**
         * Initial state
         */
        INITIAL {
            @Override
            public State getNextState(final ScanStateMachine sm, final ScanEvent event, final Object prm) {
                switch (event) {
                    case ACTIVITY_CREATED:
                        return INITIAL;
                    case ACTIVITY_BOOT_COMPLETED:
                        return IDLE;
                    case ACTIVITY_BOOT_FAILED:
                        return INITIAL;
                    default:
                        return super.getNextState(sm, event, prm);
                }
            }
        },
        /**
         * The state before the job is started after the job has been created
         */
        IDLE {
            @Override
            public State getNextState(final ScanStateMachine sm, final ScanEvent event, final Object prm) {
                switch (event) {
                    case CHANGE_JOB_STATE_PENDING:
                        return JOB_PENDING;
                    case REQUEST_JOB_START:
                        return WAITING_JOB_START;
                    //add
                    case ACTIVITY_CREATED:
                        return INITIAL;
                    default:
                        return super.getNextState(sm, event, prm);
                }
            }
        },
        WAITING_JOB_START {
            @Override
            public State getNextState(final ScanStateMachine sm, final ScanEvent event, final Object prm) {
                switch (event) {
                    case REQUEST_JOB_CANCEL:
                        return WAITING_JOB_CANCEL;

                    case CHANGE_JOB_STATE_PENDING:
                        return JOB_PENDING;
                    case CHANGE_JOB_STATE_PROCESSING:
                        return JOB_PROCESSING;

                    case CHANGE_JOB_STATE_ABORTED:
                        return JOB_ABORTED;
                    case CHANGE_JOB_STATE_CANCELED:
                        return JOB_CANCELED;

                    case ACTIVITY_DESTROYED:
                        return WAITING_JOB_CANCEL;
                    default:
                        return super.getNextState(sm, event, prm);
                }
            }

            @Override
            public void entry(final ScanStateMachine sm, final Object prm) {
                super.entry(sm, prm);
                sm.new StartScanJobTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
            }
        },
        ...;

        /**
         * Obtains the next state.
         * Each state should override this method.
         *
         * @param sm
         * @param event
         * @param prm   Object for additional information
         * @return
         */
        public State getNextState(final ScanStateMachine sm, final ScanEvent event, final Object prm) {
            switch (event) {
                default:
                    return null;
            }
        }

        public void entry(final ScanStateMachine sm, final Object prm) {
        }

        public void exit(final ScanStateMachine sm, final Object prm) {
        }
    }

    public void procScanEvent(final ScanEvent event, final Object prm) {
        LogC.i(TAG, ">evtp :" + event);
        mHandler.post(new Runnable() {
            @Override
            public void run() {
                State newState = mState.getNextState(ScanStateMachine.this, event, prm);
                if (newState != null) {
                    LogC.i(TAG, "#evtp :" + event + " state:" + mState + " > " + newState);
                    mState.exit(ScanStateMachine.this, prm);
                    mState = newState;
                    mState.entry(ScanStateMachine.this, prm);
                }
            }
        });
    }
}

转载于:https://my.oschina.net/leonardtang/blog/786933

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值