您的位置:首页 > 编程语言 > Java开发

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在我们现有代码里面如何使用,这一张我们来简单分析一下其源码;

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方法;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  状态机 stateless4j