有限状态机实现-简单有限状态机实现(二)

上一节介绍了State,Event的实现,相对简单一些,所有的逻辑围绕的是事件驱动所需要的表示问题,这种概念性的东西,我尽量每节少讲,保持一个比较高的更新频率,方便消化。这一节将介绍Action,将会越来越接近状态的流转核心。

Action干的那些事

Action顾名思义是行为,即状态流转要进行的操作,是具体的业务逻辑的实现。Action的定义比较随意,但也比较讲究。随意的是你所有的逻辑都是写在Action里的,可按照自己喜欢的编程方式来定义,甚至可以按需实现一些接口来达到拓展的目的(当然要在状态机的流转里对拓展添加必要的逻辑)。讲究的是Action里要提供一些约定的固定的方法来让状态机执行,另外为了上线文的传递,拓展的方法的参数最好为context,方便状态机的操作。
Action的执行结果决定了状态的下一个流转状态。一个State在接收到一个Event,根据执行的结果可能有两种状态(也可以细化分为三种,所谓的第三种为自旋,执行完了,再回到自己,这是一种比较特殊的流转,可以划为将介绍的两种,也可以单独拎出来讲一讲,我们选择划归将要介绍的两种):1. 无论Action的执行结果如何,目标状态只有一种状态 2.目标状态根据Action的执行结果,存在多个不同的目标状态的可能。我们将存在存在多个目标状态的Action定位为决策Action,因为我们就存在了两种Action的定义

Action代码实现

实现相对简单,直接上代码了

public interface Action {
    /**
     * 是否满足执行条件
     * @return
     */
    boolean isSatisfied(Context context);
    /**
     * 状态变更前
     * @param context
     */
    void beforeStateChange(Context context);
    /**
     * 状态变更后
     * @param context
     */
    void afterStateChange(Context context);
}

Action接口定义了一些通用的行为,这里只是列举了常用的一些,但是不见得就满足了所有的读者的需求,所有读者有个性的话的操作,也可以在这里定义。isSatisfied做一些当前是否满足了执行条件,不满足就继续等待,不执行Action,等待下次触发。beforeStateChange指在状态变更前进行的操作(并不是Action执行前),其实是指Action结束了,将要执行状态変更要做的操作。afterStateChange是状态変更后要做的事

public interface NormalAction extends Action {
    /**
     * 执行
     * @param context
     */
    void doAction(Context context);
}

我们将只会有一个目标状态的Action取名NormalAction,所以也没必要有返回值

public interface DecisionAction extends Action{
    /**
     * 状态决策Action
     * @param context
     * @return
     */
    S doDecideAction(Context context);
}

存在多种可能返回状态的,我们取名DecisionAction,doDecideAction是要有具体的State返回的。
上述所有的方法里参数都是Context,只是一个上下文,用来传递参数,目前可以先忽略,下一节介绍。定义Action的时候,都是实现NormalAction 或 DecisionAction 接口。

你可能感兴趣的:(有限状态机实现-简单有限状态机实现(二))