简要回顾上一篇文章简易版订单系统定义的几个初始状态java
秉着不重复造轮子的原则,笔者以前订单系统主要借鉴了hadoop yarn状态机的设计,并进行了一点小小的优化和封装编程
yarn状态机多弧过渡部分由于没有用到直接省略(感兴趣的同窗能够本身去查看源码,笔者认为多弧过渡主要是次态的可选择性,可是反而增长了不肯定性因此没有采用)接下来的部分主要是源码解析网络
状态机主要类图以下app
hadoop底层代码oop
//此方法在addTransition方法中调用 主要是构建链表
private StateMachineFactory (StateMachineFactory<OPERAND, STATE, EVENTTYPE, EVENT> that, ApplicableTransition<OPERAND, STATE, EVENTTYPE, EVENT> t) {
this.defaultInitialState = that.defaultInitialState;
this.transitionsListNode
= new TransitionsListNode(t, that.transitionsListNode);
this.optimized = false;
this.stateMachineTable = null;
}
//installTopology 中调用进行初始化过程 主要逻辑封装在makeStateMachineTable()方法中
private StateMachineFactory (StateMachineFactory<OPERAND, STATE, EVENTTYPE, EVENT> that, boolean optimized) {
this.defaultInitialState = that.defaultInitialState;
this.transitionsListNode = that.transitionsListNode;
this.optimized = optimized;
if (optimized) {
makeStateMachineTable();
} else {
stateMachineTable = null;
}
}
//
private void makeStateMachineTable() {
//建立堆栈 ApplicableTransition将此前链表的各个ApplicableTransition压入栈中
Stack<ApplicableTransition<OPERAND, STATE, EVENTTYPE, EVENT>> stack =
new Stack<ApplicableTransition<OPERAND, STATE, EVENTTYPE, EVENT>>();
Map<STATE, Map<EVENTTYPE, Transition<OPERAND, STATE, EVENTTYPE, EVENT>>>
prototype = new HashMap<STATE, Map<EVENTTYPE, Transition<OPERAND, STATE, EVENTTYPE, EVENT>>>();
prototype.put(defaultInitialState, null);//默认状态
// 构建拓扑表 每一个状态都有一个对应的
stateMachineTable
= new EnumMap<STATE, Map<EVENTTYPE,
Transition<OPERAND, STATE, EVENTTYPE, EVENT>>>(prototype);
for (TransitionsListNode cursor = transitionsListNode;
cursor != null;
cursor = cursor.next) {
stack.push(cursor.transition);
}
//apply方法就是完整构建拓扑表过程 此处简要描述 在拓扑表中找到当前订单状态的动做映射map,而后把动做放入此map中
while (!stack.isEmpty()) {
stack.pop().apply(this);
}
}
复制代码
//建立一个初始状态机
private static final StateMachineFactory<OrderRequest, OrderStatusEnum, OrderEvent.OrderEventEnum, OrderEvent> stateMachineFactory = new StateMachineFactory<OrderRequest, OrderStatusEnum, OrderEvent.OrderEventEnum, OrderEvent>(OrderStatusEnum.INVALID)
//调用私有构造方法 添加单弧事件去transitionsListNode
.addTransition(OrderStatusEnum.INVALID, OrderStatusEnum.SUBMIT_ORDER, OrderEvent.OrderEventEnum.INIT_SUCCESS, new OrderInitTransition())
//构建拓扑表
.installTopology();
复制代码
//将自定义request参数传入状态机,根据传入status为默认状态返回一个状态机。
//若是拓扑表为构建会从新执行一遍构建过程
orderStateMachine = OrderStateMachine.getStateMachine(request, OrderStatusEnum.getById(request.getOrderStatus()));
//状态转移过程 返回次态
orderStateMachine.doTransition(orderEvent.getOrderEvent(), orderEvent)
//具体doTranstion方法
private STATE doTransition (OPERAND operand, STATE oldState, EVENTTYPE eventType, EVENT event) throws InvalidStateTransitionException {
//根据订单状态找到以前构建的map
Map<EVENTTYPE, Transition<OPERAND, STATE, EVENTTYPE, EVENT>> transitionMap
= stateMachineTable.get(oldState);
if (transitionMap != null) {
//根据事件找到具体动做
Transition<OPERAND, STATE, EVENTTYPE, EVENT> transition
= transitionMap.get(eventType);
if (transition != null) {
//执行动做
return transition.doTransition(operand, oldState, event, eventType);
}
}
throw new InvalidStateTransitionException(oldState, eventType);
}
复制代码