JAVA -- stateless4j StateMachine 使用浅析(三)
2017-12-28 00:00
295 查看
摘要: 有限状态机是一种用来进行对象行为建模的工具,其作用主要是描述对象在它的生命周期内所经历的状态序列,以及如何响应来自外界的各种事件。在电商场景(订单、物流、售后)、社交(IM消息投递)、分布式集群管理(分布式计算平台任务编排)等场景都有大规模的使用. 参考文章:http://www.timguan.net/2017/06/19/%E7%8A%B6%E6%80%81%E6%9C%BA%E5%BC%95%E6%93%8E%E9%80%89%E5%9E%8B/
前面的两篇文章
https://my.oschina.net/u/3220575/blog/1595384
https://my.oschina.net/u/3220575/blog/1595876
主要介绍了stateless4j StateMachine在我们现有代码里面如何使用,这一张我们来简单分析一下其源码;
为stateless4j StateMachine的核心方法,当执行fire去触发某一个trigger时,会执行上面的方法;
通过剖析我们可以知道,
所有的trigger触发器及对应的行为,exit和entry动作实现都保存在上面这个对象中,运行时根据当前所处的state得到对应的StateRepresentation对象,并从中根据trigger得到destination,并执行exit和entry方法;
前面的两篇文章
https://my.oschina.net/u/3220575/blog/1595384
https://my.oschina.net/u/3220575/blog/1595876
主要介绍了stateless4j StateMachine在我们现有代码里面如何使用,这一张我们来简单分析一下其源码;
protected void publicFire(T trigger, Object... args) { logger.info("Firing " + trigger); TriggerWithParameters<S, T> configuration = config.getTriggerConfiguration(trigger); if (configuration != null) { configuration.validateParameters(args); } TriggerBehaviour<S, T> triggerBehaviour = getCurrentRepresentation().tryFindHandler(trigger); //1.当没有对应的trigger时,执行doIt方法,会抛出异常,提示建议ignore当前的trigger if (triggerBehaviour == null) { unhandledTriggerAction.doIt(getCurrentRepresentation().getUnderlyingState(), trigger); return; } //2.得到source状态 S source = getState(); OutVar<S> destination = new OutVar<>(); //3.在这里判断当初注册trigger时使用的是permit OR ignore,若是permit则返回为true,若是ignore返回为false if (triggerBehaviour.resultsInTransitionFrom(source, args, destination)) { //4.new了一个transition 的上下文对象,并将source,trigger及destination装载进去 Transition<S, T> transition = new Transition<>(source, destination.get(), trigger); //5.执行exitAction getCurrentRepresentation().exit(transition); //6.改变statemachine的state为target状态 setState(destination.get()); //7.执行entryAction getCurrentRepresentation().enter(transition, args); } }
为stateless4j StateMachine的核心方法,当执行fire去触发某一个trigger时,会执行上面的方法;
通过剖析我们可以知道,
public class StateRepresentation<S, T> { private final S state; private final Map<T, List<TriggerBehaviour<S, T>>> triggerBehaviours = new HashMap<>(); private final List<Action2<Transition<S, T>, Object[]>> entryActions = new ArrayList<>(); private final List<Action1<Transition<S, T>>> exitActions = new ArrayList<>(); private final List<StateRepresentation<S, T>> substates = new ArrayList<>(); private StateRepresentation<S, T> superstate; // null ... ... }
所有的trigger触发器及对应的行为,exit和entry动作实现都保存在上面这个对象中,运行时根据当前所处的state得到对应的StateRepresentation对象,并从中根据trigger得到destination,并执行exit和entry方法;
相关文章推荐
- JAVA -- stateless4j StateMachine 使用浅析(二)
- JAVA -- stateless4j StateMachine 使用浅析(一)
- 浅析Java多线程技术中所使用的方法
- 浅析Java中Ant的使用
- 浅析Java异常处理中断言的使用
- Java的绘图模式使用浅析
- Java天地 学习探讨Java Spring中使用classpath加载配置文件浅析
- Redis安装及Java客户端的使用浅析(jedis)
- 浅析Java语言中两种异常使用的差别
- 浅析javac和java的使用:MVC模式下,在包中的java文件的编译执行
- Java ThreadLocal使用浅析
- 浅析java中BigDecimal大数值类的使用
- Java开发Dubbo分布式框架使用及原理浅析
- Redis安装及Java客户端的使用浅析(jedis)
- java--Progress类的使用浅析
- 浅析总结 Java 内部类的一些使用与梳理
- Java ThreadLocal使用浅析
- Java并发包使用及源码浅析(线程池)
- Java ThreadLocal使用浅析
- 浅析总结 Java 内部类的一些使用与梳理