JAVA -- stateless4j StateMachine 使用浅析(一)
2019独角兽企业重金招聘Python工程师标准>>>
业务场景:
我们都玩过超级玛丽这款经典的游戏,里面有一个问题;就是玛丽的状态变化;
/*** Created by Administrator on 2017/12/26.* * 超级玛丽所有存在的状态state*/
public enum CurrentState {/*** 初始化时小形态*/SMALL,/*** 吃到一个蘑菇时的大形态*/BIG,/*** 吃到花朵,可攻击形态*/ATTACH,/*** godead*/DEAD}
/*** Created by Administrator on 2017/12/26.** 超级玛丽会遇到触发状态改变的trigger*/
public enum Trigger {/*** 蘑菇*/MUSHROOM,/*** 花朵*/FLOWER,/*** 妖怪*/MONSTER
}
import com.github.oxo42.stateless4j.StateMachineConfig;/*** Created by Administrator on 2017/12/26.* * state和trigger注册*/
public class StateConver {private 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);}
}
import com.github.oxo42.stateless4j.StateMachine;
import org.junit.Test;/*** Created by Administrator on 2017/12/26.** 状态机测试类*/
public class RunStateMachine {private static StateMachine<CurrentState,Trigger> stateMachine = new StateMachine<CurrentState, Trigger>(CurrentState.SMALL,StateConver.config);@Testpublic void testStateMachine(){stateMachine.fire(Trigger.FLOWER);System.out.println("currentState-->"+stateMachine.getState());}
}
点击运行:发现竟然报错了... ...
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/D:/JAVA/localRepository-Maven/ch/qos/logback/logback-classic/1.1.11/logback-classic-1.1.11.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/D:/JAVA/localRepository-Maven/org/slf4j/slf4j-jdk14/1.7.25/slf4j-jdk14-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
23:39:32,496 |-INFO in ch.qos.logback.classic.LoggerContext[myAppName] - Could NOT find resource [logback.groovy]
23:39:32,496 |-INFO in ch.qos.logback.classic.LoggerContext[myAppName] - Could NOT find resource [logback-test.xml]
23:39:32,517 |-INFO in ch.qos.logback.classic.LoggerContext[myAppName] - Found resource [logback.xml] at [file:/E:/ideaworkspace/spbmyp/target/classes/logback.xml]
23:39:32,697 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - debug attribute not set
23:39:32,703 |-INFO in ch.qos.logback.classic.joran.action.ContextNameAction - Setting logger context name as [myAppName]
23:39:32,703 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]
23:39:32,706 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [console]
23:39:32,710 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property
23:39:32,743 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.rolling.RollingFileAppender]
23:39:32,746 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [rollingFile]
23:39:32,756 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy@1413378318 - Will use zip compression
23:39:32,756 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy@1413378318 - Will use the pattern logs/logback_myDemo-%d{yyyy-MM-dd}.%i.log for the active file
23:39:32,760 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@57f23557 - The date pattern is 'yyyy-MM-dd' from file name pattern 'logs/logback_myDemo-%d{yyyy-MM-dd}.%i.log.zip'.
23:39:32,760 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@57f23557 - Roll-over at midnight.
23:39:32,774 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@57f23557 - Setting initial period to Fri Oct 20 15:23:10 CST 2017
23:39:32,775 |-WARN in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@57f23557 - SizeAndTimeBasedFNATP is deprecated. Use SizeAndTimeBasedRollingPolicy instead
23:39:32,775 |-WARN in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@57f23557 - For more information see http://logback.qos.ch/manual/appenders.html#SizeAndTimeBasedRollingPolicy
23:39:32,776 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property
23:39:32,778 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[rollingFile] - Active log file name: logs/logback_myDemo.log
23:39:32,778 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[rollingFile] - File property is set to [logs/logback_myDemo.log]
23:39:32,779 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [org.springframework] to DEBUG
23:39:32,779 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [com.ibatis] to DEBUG
23:39:32,779 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [com.ibatis.common.jdbc.SimpleDataSource] to DEBUG
23:39:32,779 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [com.ibatis.common.jdbc.ScriptRunner] to DEBUG
23:39:32,779 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate] to DEBUG
23:39:32,779 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [java.sql.Connection] to DEBUG
23:39:32,779 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [java.sql.Statement] to DEBUG
23:39:32,779 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [java.sql.PreparedStatement] to DEBUG
23:39:32,779 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [org.springframework.amqp] to WARN
23:39:32,779 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to DEBUG
23:39:32,779 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [console] to Logger[ROOT]
23:39:32,780 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [rollingFile] to Logger[ROOT]
23:39:32,780 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration.
23:39:32,780 |-INFO in ch.qos.logback.classic.joran.JoranConfigurator@3d0f8e03 - Registering current configuration as safe fallback pointSLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]
2017-12-26 23:39:32.786 myAppName [main] INFO com.github.oxo42.stateless4j.StateMachine - Firing FLOWERProcess finished with exit code 0
其实就是包冲突了,上面的两个包都依赖了SLF4J的包,导入那两个包后SLF4J的包被导入了2次,导致冲入,解决一下:
<!--状态机--><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>
其中:<exclusions><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-jdk14</artifactId></exclusion></exclusions> 的意思就是在stateless4j的导包时不导入slf4j的包,这样就不会冲突了;
再次运行测试类:
2017-12-26 23:51:37.386 myAppName [main] INFO com.github.oxo42.stateless4j.StateMachine - Firing FLOWER
currentState-->ATTACH
成功!
转载于:https://my.oschina.net/JackieRiver/blog/1595384
JAVA -- stateless4j StateMachine 使用浅析(一)相关推荐
- stateless java_JAVA -- stateless4j StateMachine 使用浅析(二)
回顾: 在上一篇文章 中,我们介绍了stateless4j statemachine的使用入门,这一篇我们介绍 Exit && Entry Action; 废话不多说,show you ...
- Java数据库连接池--DBCP浅析
转载自 Java数据库连接池--DBCP浅析 前言对于数据库连接池, 想必大家都已经不再陌生, 这里仅仅设计Java中的两个常用数据库连接池: DBCP和C3P0(后续会更新). 一. 为何要使用 ...
- 【转载】Java 内存分配全面浅析
本文将由浅入深详细介绍Java内存分配的原理,以帮助新手更轻松的学习Java.这类文章网上有很多,但大多比较零碎.本文从认知过程角度出发,将带给读者一个系统的介绍. 本文转载自袭烽大神的博客,原文链接 ...
- java printf与println_浅析Java中print、printf、println的区别
我们的程序员在开发的时候,都会使用到很多不同的功能,但是有些功能是大同小异,别着急,下文是爱站技术频道小编为大家带来的浅析Java中print.printf.println的区别,希望对你学习有帮助! ...
- Java集合源码浅析(一) : ArrayList
(尊重劳动成果,转载请注明出处:https://yangwenqiang.blog.csdn.net/article/details/105418475冷血之心的博客) 背景 一直都有这么一个打算,那 ...
- Java之list去重浅析
在java日常开发中,会遇到对ist进行去重处理的需求,下面对其解决方式进行浅析. List 去重指的是将 List 中的重复元素删除掉的过程. 方式有3中实现思路,1通过循环判断当前元素是否存在多个 ...
- Java的反射作用_浅析Java 反射机制的用途和缺点
反射的用途 Uses of Reflection Reflection is commonly used by programs which require the ability to examin ...
- java中的action_浅析java中action的作用
正如早先指出的那样,action()并不是我们对所有事进行分类后自动为handleEvent()调用的唯一方法.有三个其它的被调用的方法集,如果我们想捕捉某些类型的事件(键盘.鼠标和焦点事件),因此我 ...
- java深度克隆_浅析Java中clone()方法浅克隆与深度克隆
现在Clone已经不是一个新鲜词语了,伴随着"多莉"的产生这个词语确实很"火"过一阵子,在Java中也有这么一个概念,它可以让我们很方便的"制造&qu ...
最新文章
- python代码获取今天、昨天、明天的日期
- 腾讯 Robotics X 实验室首次「开箱」移动机器人,能走梅花桩,还能自平衡
- 达人眼中的WINCE网络驱动
- pd16.5生成mysql列说明_PowerDesigner16逆向工程生成PDM列注释(My Sql5.0模版)
- Joint Bilateral Filtering 双边滤波
- 使用多线程一定提高效率吗?
- idea中修改代码大小设置
- error: undefined reference to 'cv::_OutputArray::_OutputArray(std::__ndk1
- DllImport 自动选择x64或x86 dll
- 51nod-动物与游戏【树链剖分,线段树】
- linux内核cpu负载计算,CPU 负载 — The Linux Kernel documentation
- 【转】DPDK(一):专业术语
- POJ 3268 Silver Cow Party (最短路径)
- Centos系统服务FAQ汇总(下)
- 浅谈一下session问题
- 进程间通信系列 之 信号实例
- 小程序学习笔记三:页面文件详解之视图层WXML、WXS、WXSS文件
- 太极图形html5代码,太极图案用html5怎样
- NLP初学-简易聊天机器人
- 庖丁解牛linux内核,庖丁解牛Linux网络核心
热门文章
- 什么东西比地球上的沙子还要多?
- mysql 删除check_数据库中五种check约束添加/删除方法
- 【jvm系列-01】初识虚拟机与java虚拟机
- 在wsl的图形化界面中无法启动没有管理权限的“synaptic软件包管理器”
- 河北省谷歌地球高程DEM等高线下载
- matlab常用工具箱汇总(附toolbox下载地址)
- 酵母风味的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
- linux和window下mkdir函数问题(转-锦曦月)
- 运筹学状态转移方程例子_动态规划 Dynamic Programming
- 随机对照双盲实验的设计模式