概念:
State:状态
Event:事件,状态由事件触发,引起变化
Transition:流转,表示从一个状态到另一个状态
External Transition:外部流转,两个不同状态之间的流转
Internal Transition:内部流转,同一个状态之间的流转
Condition:条件,表示是否允许到达某个状态
Action:动作,到达某个状态之后,可以做什么
StateMachine:状态机
外部状态转移的test用例:
过程描述:起始状态STATE1,结束状态STATE2,当发生EVENT1时执行状态转移,当满足checkCondition()时,执行doAction,执行成功则返回状态STATE2,否则返回STATE1。
@Test
public void testExternalNormal(){
// 第一步:生成一个状态机builder
StateMachineBuilder<States, Events, Context> builder = StateMachineBuilderFactory.create();
// 第二步:设置一个外部状态转移类型的builder,并设置from\to\on\when\perform
builder.externalTransition()
.from(States.STATE1)
.to(States.STATE2)
.on(Events.EVENT1)
.when(checkCondition())
.perform(doAction());
// 第三步:设置状态机的id和ready,并在StateMachineFactory中的stateMachineMap进行注册
StateMachine<States, Events, Context> stateMachine = builder.build(MACHINE_ID);
// 第四步:触发状态机
States target = stateMachine.fireEvent(States.STATE1, Events.EVENT1, new Context());
Assert.assertEquals(States.STATE2, target);
}
1. 第一步:
- StateMachineBuilderFactory.create()
public class StateMachineBuilderFactory {
// 创建了一个StateMachineBuilderImpl实例对象
public static <S, E, C> StateMachineBuilder<S, E, C> create(){
return new StateMachineBuilderImpl<>();
}
}
2. 第二步:
- builder.externalTransition()
public class StateMachineBuilderImpl<S, E, C> implements StateMachineBuilder<S, E, C> {
/**
* StateMap is the same with stateMachine, as the core of state machine is holding reference to states.
*/
private final Map<S, State< S, E, C>> stateMap = new ConcurrentHashMap<>();
...
// 创建了一个TransitionBuilderImpl对象,并传入空的stateMap(状态表),类型为EXTERNAL
@Override
public ExternalTransitionBuilder<S, E, C> externalTransition() {
return new TransitionBuilderImpl<>(stateMap, TransitionType.EXTERNAL);
}
...
}
new TransitionBuilderImpl<>(stateMap, TransitionType.EXTERNAL)
class TransitionBuilderImpl<S,E,C> implements ExternalTransitionBuilder<S,E,C>, InternalTransitionBuilder<S,E,C>, From<S,E,C>, On<S,E,C>, To<S,E,C> {
final Map<S, State<S, E, C>> stateMap;
...
final TransitionType transitionType;
// 把状态表和状态机类型赋给本地变量
public TransitionBuilderImpl(Map<S, State<S, E, C>> stateMap, TransitionType transitionType) {
this.stateMap = stateMap;
this.transitionType = transitionType;
}
...
}

本文详细解析了状态机(State Machine)的设计原理与测试方法,包括状态(State)、事件(Event)、流转(Transition)等核心概念,以及如何通过外部流转(ExternalTransition)和内部流转(InternalTransition)构建复杂的状态转换逻辑。
最低0.47元/天 解锁文章
803

被折叠的 条评论
为什么被折叠?



