JAVA -- stateless4j StateMachine 使用浅析(三)

前面的两篇文章

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值