简介
有限状态机是一种用来进行对象行为建模的工具,其作用主要是描述对象在它的生命周期内所经历的状态序列,以及如何响应来自外界的各种事件。
在电商场景(订单、物流、售后)、社交(IM消息投递)、分布式集群管理(分布式计算平台任务编排)等场景都有大规模的使用。
复制代码
状态机的要素
状态机可归纳为4个要素,即现态、条件、动作、次态。“现态”和“条件”是因,“动作”和“次态”是果。
复制代码
- 现态:是指当前所处的状态。
- 条件:又称为事件。当一个条件被满足,将会触发一个动作,或者执行一次状态的迁移。
- 动作:条件满足后执行的动作。动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作不是必需的,当条件满足后,也可以不执行任何动作,直接迁移到新状态。
- 次态:条件满足后要迁往的新状态。“次态”是相对于“现态”而言的,“次态”一旦被激活,就转变成新的“现态”了。
状态机动作类型
- 进入动作:在进入状态时进行
- 退出动作:在退出状态时进行
- 输入动作:依赖于当前状态和输入条件进行
- 转移动作:在进行特定转移时进行
为什么使用状态机
有限状态机是一种对象行为建模工具,适用对象有一个明确并且复杂的生命流(一般而言三个以上状态),并且在状态变迁存在不同的触发条件以及处理行为。
复制代码
核心模型
- StateMachineBuilderFactory:StateMachineBuilder工厂类,负责解析状态定义,根据状态定义创建对应的StateMachineBuilder
- StateMachineBuilder:StateMachine构造器,可复用构造器,所有状态机由生成器创建,相同的状态机实例共享相同的状态定义
- StateMachine:状态机实例,通过StateMachineBuilder创建,轻量级内存实例,不可共享
- Condition:squirrel支持动态的transition
- StateMachineListener:全局事件监听
核心实现
squirrel的事件执行器的作用点粒度更细,通过预处理,将一个状态迁移分解成exit、trasition、entry这三个action event,再递交给执行器分别执行
复制代码
事件处理过程
- 状态正常迁移 TransitionBegin–(exit->transition->entry)–>TransitionComplete–>TransitionEnd
- 状态迁移异常 TransitionBegin–(exit->transition->entry)–>TransitionException–>TransitionEnd
- 状态迁移事件拒绝 TransitionBegin–>TransitionDeclined–>TransitionEnd
<dependency>
<groupId>org.squirrelframework</groupId>
<artifactId>squirrel-foundation</artifactId>
<version>0.3.8</version>
</dependency>
复制代码
转载于:https://juejin.im/post/5c7754ab6fb9a049d51a2ed5