a. 调用StateMachineFactory 第一个构造函数,初始化状态机
b. 调用StateMachineFactory 第二个构造函数,添加状态流转流程
如:添加RMAppNewlySavingTransition 操作
.addTransition(RMAppState.NEW, RMAppState.NEW_SAVING,
RMAppEventType.START, new RMAppNewlySavingTransition())
第二个构造函数其实就干了一件事情:构建 transitionsListNode 链
this.transitionsListNode
= new TransitionsListNode(t, that.transitionsListNode);
c. 调用StateMachineFactory 第三个构造函数,完成状态机构建,并将状态机赋值给变量stateMachine
.installTopology()
``
`
第三个构造函数其实最终调用的就是 makeStateMachineTable 方法
该方法内容包括:
1. 初始化一个空的 两层map stateMachineTable
2. 遍历 transitionsListNode 链
3. 从 transitionsListNode 链中取出 ApplicableTransition<OPERAND, STATE, EVENTTYPE, EVENT> 对象,并执行其 apply() 方法
apply 方法是实际的构建 两层 map stateMachineTable 的过程
```java
@Override
public void apply
(StateMachineFactory<OPERAND, STATE, EVENTTYPE, EVENT> subject) {
Map<EVENTTYPE, Transition<OPERAND, STATE, EVENTTYPE, EVENT>> transitionMap
= subject.stateMachineTable.get(preState);
if (transitionMap == null) {
// I use HashMap here because I would expect most EVENTTYPE's to not
// apply out of a particular state, so FSM sizes would be
// quadratic if I use EnumMap's here as I do at the top level.
transitionMap = new HashMap<EVENTTYPE,
Transition<OPERAND, STATE, EVENTTYPE, EVENT>>();
subject.stateMachineTable.put(preState, transitionMap);
}
transitionMap.put(eventType, transition);
}
d. 将构建到状态机赋值给变量
最终通过make方法将状态机赋值给 stateMachine变量 ,注意make方法返回到是一个InternalStateMachine 对象
final StateMachine<RMAppState, RMAppEventType, RMAppEvent> this.stateMachine = stateMachineFactory.make(this);