我是靠谱客的博主 虚拟电话,最近开发中收集的这篇文章主要介绍JAVA -- stateless4j StateMachine 使用浅析(三),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

前面的两篇文章

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方法;

转载于:https://my.oschina.net/JackieRiver/blog/1595884

最后

以上就是虚拟电话为你收集整理的JAVA -- stateless4j StateMachine 使用浅析(三)的全部内容,希望文章能够帮你解决JAVA -- stateless4j StateMachine 使用浅析(三)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部