`

stateless4j StateMachine (一)

阅读更多

<audio class="audio-for-speech" src="/admin/blogs/2519501/"></audio>

<audio class="audio-for-speech" src="/admin/blogs/2519501/"></audio>

业务场景:

   我们都玩过超级玛丽这款经典的游戏,里面有一个问题;就是玛丽的状态变化;

 

一、添加依赖

<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.enums.CurrentState;
import com.example.demo.stateless4j.enums.Trigger;
import com.github.oxo42.stateless4j.StateMachineConfig;

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

    static {
        /**
         * 最初为small状态时
         */
        config.configure(CurrentState.SMALL)
                /**
                 * 遇到蘑菇触发-->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);

    }

}

 

 

四、测试

public class RunStateMachine {

    private static StateMachine<CurrentState,Trigger> stateMachine = new StateMachine<CurrentState, Trigger>(CurrentState.SMALL,StateConfig.config);
    @Test
    public void testStateMachine(){
        stateMachine.fire(Trigger.FLOWER);
        System.out.println("currentState-->"+stateMachine.getState());
    }
}

 

 

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

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics