`

stateless4j StateMachine (二)

 
阅读更多

这一篇我们介绍 Exit && Entry Action
一、依赖
<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>

二、枚举类
/**
*
* 超级玛丽所有存在的状态state
*/
public enum CurrentState {
    /**
     * 初始化时小形态
     */
    SMALL,
    /**
     * 吃到一个蘑菇时的大形态
     */
    BIG,
    /**
     * 吃到花朵,可攻击形态
     */
    ATTACH,
    /**
     * 死亡
     */
    DEAD

}

/**
*
* 超级玛丽会遇到触发状态改变的trigger
*/
public enum Trigger {

    /**
     * 蘑菇
     */
    MUSHROOM,

    /**
     * 花朵
     */
    FLOWER,

    /**
     * 妖怪
     */
    MONSTER
}


三、配置信息
import com.example.demo.stateless4j.action.EntryAction;
import com.example.demo.stateless4j.action.ExitAction;
import com.example.demo.stateless4j.enums.CurrentState;
import com.example.demo.stateless4j.enums.Trigger;
import com.github.oxo42.stateless4j.StateMachineConfig;

public class StateConfig2 {

    public static StateMachineConfig<CurrentState, Trigger> config = new StateMachineConfig<>();

    static {
        /**
         * 最初为small状态时
         */
        config.configure(CurrentState.SMALL)
                /**
                 * 从当前状态改变时所触发的动作
                 */
                .onExit(new ExitAction())
                /**
                 * 改变到当前状态时所触发的动作
                 */
                .onEntry(new EntryAction())
                /**
                 * 遇到蘑菇触发-->big状态
                 */
                .permit(Trigger.MUSHROOM,CurrentState.BIG)
                /**
                 * 花朵触发,-->直接变为可攻击状态
                 */
                .permit(Trigger.FLOWER,CurrentState.ATTACH)
                /**
                 * 妖怪触发,死亡状态
                 */
                .permit(Trigger.MONSTER,CurrentState.DEAD);

        /**
         * 最初为big状态
         */
        config.configure(CurrentState.BIG)
                /**
                 * 蘑菇触发,状态不变,
                 * permitReentry方法state变化相同,但具体执行过程有一些区别
                 */
                .ignore(Trigger.MUSHROOM)
                .permit(Trigger.FLOWER,CurrentState.ATTACH)
                .permit(Trigger.MONSTER,CurrentState.SMALL);

        config.configure(CurrentState.ATTACH)
                .ignore(Trigger.MUSHROOM)
                .ignore(Trigger.FLOWER)
                .permit(Trigger.MONSTER,CurrentState.SMALL);

        config.configure(CurrentState.DEAD)
                .ignore(Trigger.MUSHROOM)
                .ignore(Trigger.FLOWER)
                .ignore(Trigger.MONSTER);

    }
}

四、触发动作
import com.example.demo.stateless4j.enums.CurrentState;
import com.example.demo.stateless4j.enums.Trigger;
import com.github.oxo42.stateless4j.delegates.Action1;
import com.github.oxo42.stateless4j.transitions.Transition;

public class EntryAction implements Action1<Transition<CurrentState, Trigger>> {

    @Override
    public void doIt(Transition<CurrentState, Trigger> arg1) {
        System.out.println("ENTRY TO : " +arg1.getDestination());
    }
}

import com.example.demo.stateless4j.enums.CurrentState;
import com.example.demo.stateless4j.enums.Trigger;
import com.github.oxo42.stateless4j.delegates.Action1;
import com.github.oxo42.stateless4j.transitions.Transition;
public class ExitAction implements Action1<Transition<CurrentState, Trigger>> {
    @Override
    public void doIt(Transition<CurrentState, Trigger> arg1) {
        System.out.println("OUT FROM :" + arg1.getSource());
    }
}

五、测试
private static StateMachine<CurrentState, Trigger> stateMachine = new StateMachine<CurrentState, Trigger>(CurrentState.SMALL, StateConfig2.config);

    @Test
    public void testStateMachine(){
        stateMachine.fire(Trigger.FLOWER);
        System.out.println("currentState-->"+stateMachine.getState());
        stateMachine.fire(Trigger.MONSTER);
    }

来源:https://my.oschina.net/JackieRiver/blog/1595876

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics