下面的内容基于https://github.com/alibaba/COLA。COLA 是 Clean Object-Oriented and Layered Architecture的缩写,代表“整洁面向对象分层架构”。目前COLA已经发展到COLA v4。
首先需要考虑涉及到哪些状态节点和哪些事件,如何方便状态节点的获取、状态节点如何串联起来呢?串联的方式下,如何拿到下一个状态节点?如果基于角色,如何实现?
我们知道工作流可以实现基于角色进行流程的流转,但是此时我们涉及到事件和状态,会出现多个分支,如果使用工作流实现,流程处理上,比如activiti上,可能比较复杂,因此考虑比较轻量级的状态机来实现的话,相对来说要方便一些。
1)相关状态初始化,比如:STATE1, STATE2, STATE3, STATE4
2)相关事件:比如:EVENT1, EVENT2, EVENT3, EVENT4, INTERNAL_EVENT
3)状态节点上下文:context,主要包括状态节点类型、状态节点
构建状态节点分支相关接口信息:
From 从哪个状态节点开始
To 需要到的目标状态节点
When 定义过渡期间要执行的操作 perform
Condition 满足条件时,可以从from到to状态节点
因此可以想到我们需要构建状态机的构建器必然需要:
StateMachineBuilder 状态机构建器
数据结构:状态、事件
方便构建对应的transition
其中transition中包括的方法:
构建方法:build
指定初始状态 initialState
内部过渡:internalTransition
外部过渡:externalTransition
外部过渡列表:external Transitions
没有匹配策略:noMatchStrategy
StateMachineFactory 状态机工厂涉及的方法:
构建状态机
注册状态机
展示状态机
展示状态机uml
节点操作:
基于node的数据结构进行构建,配合使用from、to、condtion、link
with设置对应的布局
使用状态的步骤:
创建stateMachineBuilder对象
基于条件进行状态节点指向构建 initiaState、from、to、on、when、perform
基于状态机id进行构建 stateMachine
执行fireEvent操作,fire的过程中拿到下一个状态节点setNextState(source,request)
可以参考COLA里面的test,可以看到COLA的具体代码实现。
总体来说cola的状态机还是蛮实用的。
基于cola的状态机还可以实现复杂的状态-事件流转。如下图所示:
审批流程、订单状态流转等。