下图展示了COLA状态机的源代码目录,可以看到非常的简洁。

1. 连贯接口 Fluent Interfaces
COLA状态机的定义使用了连贯接口Fluent Interfaces,连贯接口的一个重要作用是,限定方法调用的顺序。比如,在构建状态机的时候,我们只有在调用了from方法后,才能调用to方法,Builder模式没有这个功能。
下图中可以看到,我们在使用的时候是被严格限制的:

StateMachineBuilder builder = StateMachineBuilderFactory.create();
builder.externalTransition()
.from(States.STATE1)
.to(States.STATE2)
.on(Events.EVENT1)
.when(checkCondition())
.perform(doAction());
这是如何实现的?其实是使用了Java接口来实现。

2. 状态机注册和触发原理
这里简单梳理一下状态机的注册和触发原理。
用户执行如下代码来创建一个状态机,指定一个MACHINE_ID:
StateMachine stateMachine = builder.build(MACHINE_ID);
COLA会将该状态机在StateMachineFactory类中,放入一个ConcurrentHashMap,以状态机名为key注册。
static Map stateMachineMap = new ConcurrentHashMap<>();
注册好后,用户便可以使用状态机,通过类似下方的代码触发状态机的状态流转:
stateMachine.fireEvent(StateMachineTest.States.STATE1, StateMachineTest.Events.EVENT1, new Context("1"));
内部实现如下:

- 首先判断COLA状态机整个组件是否初始化完成。
- 通过routeTransition寻找是否有符合条件的状态流转。
- transition.transit执行状态流转。
transition.transit方法中:

检查本次流转是否符合condition,符合,则执行对应的action。
COLA状态机实战
**PS:以下实战代码取自COLA官方仓库测试类
一、状态流转使用示例
- 从单一状态流转到另一个状态
@Test
public void testExternalNormal(){
StateMachineBuilder builder = StateMachineBuilderFactory.create();
builder.externalTransition()
.from(States.STATE1)
.to(States.STATE2)
.on(Events.EVENT1)
.when(checkCondition())
.perform(doAction());
StateMachine