<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
相关推荐
状态机(Finite State Machine)是一种数学模型,可以用来描述系统的状态和状态之间的转换。状态机由三个部分组成:状态、事件和转换。状态是系统的当前状态,事件是触发状态转换的原因,转换是从一个状态到另一个...
jar包,官方版本,自测可用
jar包,官方版本,自测可用
不要从概念上分析,事实上,static双向NAT是完全对称的,一对一的 ,也只有在BOX两边的网络在拓扑级别是完全对等的情形下,这种NAT或许才是有用的,Cisco设备经常处在这样的位置,比如一个很大的stub节点的出口位置...
描述中提到的"stateless4j.zip"是一个与状态机相关的开源项目,它提供了Fluent接口,使得在Java中实现和操作状态机变得更加简洁和直观。状态机是一种计算机科学的概念,用于建模有限的、离散的状态转换系统。在软件...
GPSR(Greedy Perimeter Stateless Routing)是一种专为无线数据报网络设计的创新路由协议,它利用路由器的位置信息以及数据包的目的地来作出转发决策。GPSR在无线网络中的表现尤为突出,尤其是在密集部署和频繁移动...
"stateless" 库就是一个这样的实现,它提供了一个简单易用的方式来创建和管理状态机。 "stateless" 库的核心概念是它允许程序员定义状态和转换规则,这些规则定义了当特定条件满足时如何从一个状态移动到另一个状态...
状态机(StateMachine)是一种在计算机科学和编程领域中广泛应用的设计模式,它用于描述对象或系统在不同时间点的行为变化。这种模式将一个实体的状态(如程序、设备或过程)定义为一系列可转换的状态,并规定了从一...
标题中的“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)模式。 手册首先明确了目标受众,接着详细说明了TRex在状态无感知模式下的高级功能。首先介绍了流量配置文件示例...
有状态stateful与无状态stateless地址转换技术分析 有状态(stateful)和无状态(stateless)地址转换是两种不同的地址转换技术,分别应用于不同的网络场景中。本文将对这两种技术进行详细分析,比较它们之间的差异,并...
标题 "Be.Stateless.Stream:用于通用.NET开发的流类库" 指向的是一个专门设计用于.NET平台的开源流处理库。这个库的核心理念是提供一套无状态的流操作工具,以支持开发者进行高效、灵活的数据处理。无状态意味着在...
- 定义 Bean 类:首先,我们需要创建一个 Java 类,并使用 `@Stateless` 注解来标识它为无状态会话 Bean。 ```java @Stateless public class HelloWorldBean implements HelloWorld { // ... } ``` - 实现...
phoneCall := stateless . NewStateMachine ( stateOffHook ) phoneCall . Configure ( stateOffHook ). Permit ( triggerCallDialed , stateRinging ) phoneCall . Configure ( stateRinging ). OnEntryFrom ( ...
标题 "stateless-future-util_2.11-0.1.0.zip" 提供的信息表明,这是一个软件库,可能是Scala编程语言的一个组件,因为版本号2.11对应于Scala的一个主要版本。"stateless-future-util"部分暗示这个库可能与无状态的...
标题中的"AODV_2.rar"表明这是一个关于Ad hoc On-Demand Distance Vector (AODV)路由协议的压缩文件,而"AODV右手法则"指的是AODV路由选择的一种策略。AODV是一种适用于移动自组织网络(MANETs)的动态路由协议,它在...