`

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

 

 

分享到:
评论

相关推荐

    浅析C# 状态机Stateless

    状态机(Finite State Machine)是一种数学模型,可以用来描述系统的状态和状态之间的转换。状态机由三个部分组成:状态、事件和转换。状态是系统的当前状态,事件是触发状态转换的原因,转换是从一个状态到另一个...

    com.googlecode.stateless4j-osgi-1.0.jar

    jar包,官方版本,自测可用

    com.googlecode.stateless4j-osgi-1.0.1.jar

    jar包,官方版本,自测可用

    一个iptables的stateless NAT模块实现

    不要从概念上分析,事实上,static双向NAT是完全对称的,一对一的 ,也只有在BOX两边的网络在拓扑级别是完全对等的情形下,这种NAT或许才是有用的,Cisco设备经常处在这样的位置,比如一个很大的stub节点的出口位置...

    pa-client_2.10-4.9.zip

    描述中提到的"stateless4j.zip"是一个与状态机相关的开源项目,它提供了Fluent接口,使得在Java中实现和操作状态机变得更加简洁和直观。状态机是一种计算机科学的概念,用于建模有限的、离散的状态转换系统。在软件...

    GPSR: Greedy Perimeter Stateless Routing for Wireless Networks

    GPSR(Greedy Perimeter Stateless Routing)是一种专为无线数据报网络设计的创新路由协议,它利用路由器的位置信息以及数据包的目的地来作出转发决策。GPSR在无线网络中的表现尤为突出,尤其是在密集部署和频繁移动...

    stateless:一个用DELPHI代码创建状态机的简单库

    "stateless" 库就是一个这样的实现,它提供了一个简单易用的方式来创建和管理状态机。 "stateless" 库的核心概念是它允许程序员定义状态和转换规则,这些规则定义了当特定条件满足时如何从一个状态移动到另一个状态...

    StateMachine

    状态机(StateMachine)是一种在计算机科学和编程领域中广泛应用的设计模式,它用于描述对象或系统在不同时间点的行为变化。这种模式将一个实体的状态(如程序、设备或过程)定义为一系列可转换的状态,并规定了从一...

    PyPI 官网下载 | flask-stateless-auth-0.0.13.tar.gz

    标题中的“PyPI官网下载 | flask-stateless-auth-0.0.13.tar.gz”表明这是一个从Python Package Index (PyPI) 官网上获取的压缩包文件,名为“flask-stateless-auth-0.0.13.tar.gz”。PyPI是Python社区的主要资源库...

    trex_stateless.pdf

    该文档名为“trex_stateless.pdf”,说明手册中涉及的内容主要集中于TRex的状态无感知(stateless)模式。 手册首先明确了目标受众,接着详细说明了TRex在状态无感知模式下的高级功能。首先介绍了流量配置文件示例...

    有状态stateful与无状态stateless地址转换.docx

    有状态stateful与无状态stateless地址转换技术分析 有状态(stateful)和无状态(stateless)地址转换是两种不同的地址转换技术,分别应用于不同的网络场景中。本文将对这两种技术进行详细分析,比较它们之间的差异,并...

    Be.Stateless.Stream:用于通用.NET开发的流类库

    标题 "Be.Stateless.Stream:用于通用.NET开发的流类库" 指向的是一个专门设计用于.NET平台的开源流处理库。这个库的核心理念是提供一套无状态的流操作工具,以支持开发者进行高效、灵活的数据处理。无状态意味着在...

    EJB3开发第一个无状态会话bean

    - 定义 Bean 类:首先,我们需要创建一个 Java 类,并使用 `@Stateless` 注解来标识它为无状态会话 Bean。 ```java @Stateless public class HelloWorldBean implements HelloWorld { // ... } ``` - 实现...

    stateless:转到用于创建状态机的库

    phoneCall := stateless . NewStateMachine ( stateOffHook ) phoneCall . Configure ( stateOffHook ). Permit ( triggerCallDialed , stateRinging ) phoneCall . Configure ( stateRinging ). OnEntryFrom ( ...

    stateless-future-util_2.11-0.1.0.zip

    标题 "stateless-future-util_2.11-0.1.0.zip" 提供的信息表明,这是一个软件库,可能是Scala编程语言的一个组件,因为版本号2.11对应于Scala的一个主要版本。"stateless-future-util"部分暗示这个库可能与无状态的...

    AODV_2.rar_AODV右手法则_Stateless_aodv matlab_贪婪算法_贪婪算法 最小

    标题中的"AODV_2.rar"表明这是一个关于Ad hoc On-Demand Distance Vector (AODV)路由协议的压缩文件,而"AODV右手法则"指的是AODV路由选择的一种策略。AODV是一种适用于移动自组织网络(MANETs)的动态路由协议,它在...

Global site tag (gtag.js) - Google Analytics