状态机(有限状态自动机 FSM)介绍以及常用状态机种类对比

目录

状态机概念 :

为什么需要状态机: 

使用场景

状态机四要素:

常见类型状态机:

Squirrel State Machine 

 Spring Statemachine


状态机概念 :

  • 概念 : 状态机是有限状态自动机(英语:finite-state machine,缩写:FSM)的简称,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。
  • 概念 : 有限状态机是一种用来进行对象行为建模的工具,其作用主要是描述对象在它的生命周期内所经历的状态序列,以及如何响应来自外界的各种事件.
  • 例子 : 举个最简单的例子,人有三个状态:健康,感冒,康复中。触发的条件有淋雨(t1),吃药(t2),打针(t3),休息(t4)。所以状态机就是健康-(t4)->健康;健康-(t1)->感冒;感冒-(t3)->健康;感冒-(t2)->康复中;康复中-(t4)->健康,等等。就是这样状态在不同的条件下跳转到自己或不同状态的图。
  • 好处 : 应用FSM模型可以帮助对象生命周期的状态的顺序以及导致状态变化的事件进行管理。将状态和事件控制从不同的业务Service方法的if else中抽离出来

为什么需要状态机: 

有限状态机是一种对象行为建模工具,适用对象有一个明确并且复杂的生命流(一般而言三个以上状态),并且在状态变迁存在不同的触发条件以及处理行为。使用状态机来管理对象生命流的好处更多体现在代码的可维护性、可测试性上,明确的状态条件、原子的响应动作、事件驱动迁移目标状态,对于流程复杂易变的业务场景能大大减轻维护和测试的难度。

使用场景

在以下情况下,Project 是使用状态机的理想选择:

  • 应用程序或其结构的一部分可以表示为状态。
  • 您想将复杂的逻辑拆分为更小的可管理任务。
  • 应用程序已经遇到并发问题,即异步发生的事情。

如果出现以下情况,您已经在尝试实现状态机:

  • 使用布尔标志或枚举来模拟情况。
  • 具有仅对应用程序生命周期的某些部分有意义的变量。
  • 循环遍历 if/else 结构并检查是否设置了特定的标志或枚举,然后在标志和枚举的某些组合存在或不存在时做出进一步的例外处理。

状态机四要素:

状态机可归纳为4个要素,即现态、条件、动作、次态。“现态”和“条件”是因,“动作”和“次态”是果。详解如下:

  1. 现态:是指当前所处的状态 例如当前用户下了个单  , 还没付款 , 那么现态就是待付款。
  2. 条件:又称为“事件”。当一个条件被满足,将会触发一个动作,或者执行一次状态的迁移 , 例如一个订单用户付款这个动作 , 就是个事件 。
  3. 动作:条件满足后执行的动作。动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作不是必需的,当条件满足后,也可以不执行任何动作,直接迁移到新状态 , 例如 用户付完款  , 需要将订单状态改成待发货 , 该状态这个就是动作。
  4. 次态:条件满足后要迁往的新状态。“次态”是相对于“现态”而言的,“次态”一旦被激活,就转变成新的“现态”了 , 代发货就是次态 ,  付款 -> 触发修改状态动作 ->  现态由 "待付款" -> "待发货"。

常见类型状态机:

Squirrel State Machine 

官方文档 : squirrel-foundation | Squirrel State Machinesquirrel-foundation provided an easy use, type safe and highly extensible state machine implementation for Java.http://hekailiang.github.io/squirrel/

 Spring Statemachine

官方文档 : Spring Statemachine - Reference Documentationhttps://docs.spring.io/autorepo/docs/spring-statemachine/1.0.0.M3/reference/htmlsingle/#sm-statecontext

SquirrelStateMachine & SpringStateMachine对比
状态机类型体量上手难易度
SquirrelStateMachine相较于spring statemachine,squirrel的实现更为轻量,设计域也很清晰,对应的文档以及测试用例也很丰富相较于spring statemachine,squirrel上手更容易
SpringStateMachineStateMachine实例的创建比较重 , 以单例方式线程不安全,使用工厂方式对于类似订单等场景StateMachineFactory缓存订单对应的状态机实例意义不大,并且transition的注解并不支持StateMachineFactory相较于squirrel , spring statemachine上手略难

  • 4
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值