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 使用浅析(一)相关推荐

  1. stateless java_JAVA -- stateless4j StateMachine 使用浅析(二)

    回顾: 在上一篇文章 中,我们介绍了stateless4j statemachine的使用入门,这一篇我们介绍 Exit && Entry Action; 废话不多说,show you ...

  2. Java数据库连接池--DBCP浅析

    转载自   Java数据库连接池--DBCP浅析 前言对于数据库连接池, 想必大家都已经不再陌生, 这里仅仅设计Java中的两个常用数据库连接池: DBCP和C3P0(后续会更新). 一. 为何要使用 ...

  3. 【转载】Java 内存分配全面浅析

    本文将由浅入深详细介绍Java内存分配的原理,以帮助新手更轻松的学习Java.这类文章网上有很多,但大多比较零碎.本文从认知过程角度出发,将带给读者一个系统的介绍. 本文转载自袭烽大神的博客,原文链接 ...

  4. java printf与println_浅析Java中print、printf、println的区别

    我们的程序员在开发的时候,都会使用到很多不同的功能,但是有些功能是大同小异,别着急,下文是爱站技术频道小编为大家带来的浅析Java中print.printf.println的区别,希望对你学习有帮助! ...

  5. Java集合源码浅析(一) : ArrayList

    (尊重劳动成果,转载请注明出处:https://yangwenqiang.blog.csdn.net/article/details/105418475冷血之心的博客) 背景 一直都有这么一个打算,那 ...

  6. Java之list去重浅析

    在java日常开发中,会遇到对ist进行去重处理的需求,下面对其解决方式进行浅析. List 去重指的是将 List 中的重复元素删除掉的过程. 方式有3中实现思路,1通过循环判断当前元素是否存在多个 ...

  7. Java的反射作用_浅析Java 反射机制的用途和缺点

    反射的用途 Uses of Reflection Reflection is commonly used by programs which require the ability to examin ...

  8. java中的action_浅析java中action的作用

    正如早先指出的那样,action()并不是我们对所有事进行分类后自动为handleEvent()调用的唯一方法.有三个其它的被调用的方法集,如果我们想捕捉某些类型的事件(键盘.鼠标和焦点事件),因此我 ...

  9. java深度克隆_浅析Java中clone()方法浅克隆与深度克隆

    现在Clone已经不是一个新鲜词语了,伴随着"多莉"的产生这个词语确实很"火"过一阵子,在Java中也有这么一个概念,它可以让我们很方便的"制造&qu ...

最新文章

  1. python代码获取今天、昨天、明天的日期
  2. 腾讯 Robotics X 实验室首次「开箱」移动机器人,能走梅花桩,还能自平衡
  3. 达人眼中的WINCE网络驱动
  4. pd16.5生成mysql列说明_PowerDesigner16逆向工程生成PDM列注释(My Sql5.0模版)
  5. Joint Bilateral Filtering 双边滤波
  6. 使用多线程一定提高效率吗?
  7. idea中修改代码大小设置
  8. error: undefined reference to 'cv::_OutputArray::_OutputArray(std::__ndk1
  9. DllImport 自动选择x64或x86 dll
  10. 51nod-动物与游戏【树链剖分,线段树】
  11. linux内核cpu负载计算,CPU 负载 — The Linux Kernel documentation
  12. 【转】DPDK(一):专业术语
  13. POJ 3268 Silver Cow Party (最短路径)
  14. Centos系统服务FAQ汇总(下)
  15. 浅谈一下session问题
  16. 进程间通信系列 之 信号实例
  17. 小程序学习笔记三:页面文件详解之视图层WXML、WXS、WXSS文件
  18. 太极图形html5代码,太极图案用html5怎样
  19. NLP初学-简易聊天机器人
  20. 庖丁解牛linux内核,庖丁解牛Linux网络核心

热门文章

  1. 什么东西比地球上的沙子还要多?
  2. mysql 删除check_数据库中五种check约束添加/删除方法
  3. 【jvm系列-01】初识虚拟机与java虚拟机
  4. 在wsl的图形化界面中无法启动没有管理权限的“synaptic软件包管理器”
  5. 河北省谷歌地球高程DEM等高线下载
  6. matlab常用工具箱汇总(附toolbox下载地址)
  7. 酵母风味的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  8. linux和window下mkdir函数问题(转-锦曦月)
  9. 运筹学状态转移方程例子_动态规划 Dynamic Programming
  10. 随机对照双盲实验的设计模式