有限状态机FSM(Finite State Machine)及实现方式介绍

1、为何引入有限状态机?

    最近作一个项目,项目中不少实体(Entity),每一个实体都有不少状态(State),各状态会通过不一样事件(Event)触发后转换到另外一个状态。这些事件包括但不限于:用户页面点击触发,生效时间或失效时间到达,其余依赖实体状态变动等。在状态变动后还会有一系列动做(Action)处理。一旦相互依赖实体或实体自己状态增多,状态转换变多,处理这些状态的业务代码也会分散在各处,代码处理很容易漏掉,维护成本很高。因此考虑引入有限状态机。html

2、什么是有限状态机?

  有限状态机,也称为FSM(Finite State Machine),其在任意时刻都处于有限状态集合中的某一状态。当其得到一个输入字符时,将从当前状态转换到另外一个状态,或者仍然保持在当前状态。任何一个FSM均可以用状态转换图来描述,图中的节点表示FSM中的一个状态,有向(方向表示从一个初态转换到次态)加权(权表示事件)边表示输入字符时状态的变化。若是图中不存在与当前状态与输入字符对应的有向边,则FSM将进入“消亡状态(Doom State)”,此后FSM将一直保持“消亡状态”。状态转换图中还有两个特殊状态:状态1称为“起始状态”,表示FSM的初始状态。状态6称为“结束状态”git

在启动一个FSM时,首先必须将FSM置于“起始状态”,而后触发一系列时间,最终,FSM会到达“结束状态”或者“消亡状态”。github

 

                                                 图1:状态转换图spring

说明:设计模式

在一般的FSM模型中,通常还存在一个“接受状态”,而且FSM能够从“接受状态”转换到另外一个状态,只有在识别最后一个字符后,才会根据最终状态来决定是否接受所输入的字符串。此外,也能够将“其实状态”也做为接受状态,所以空的输入序列也是能够接受的。less

1. 状态机要素

状态机可概括为4个要素,即现态、条件、动做、次态。“现态”和“条件”是因,“动做”和“次态”是果。详解以下:
①现态:是指当前所处的状态。
②条件:又称为“事件”。当一个条件被知足,将会触发一个动做,或者执行一次状态的迁移。
③动做:条件知足后执行的动做。动做执行完毕后,能够迁移到新的状态,也能够仍旧保持原状态。动做不是必需的,当条件知足后,也能够不执行任何动做,直接迁移到新状态。
④次态:条件知足后要迁往的新状态。“次态”是相对于“现态”而言的,“次态”一旦被激活,就转变成新的“现态”了。
咱们能够用状态表了表示整个过程,以下图所示。post

                                                       图2:状态转换表ui

2. 有限状态机表示方法

①状态转换图,例如图1url

②状态转换表,例如图2设计

 

 3、有限状态机实现方式

1. Java switch case 或者 Scala 模式匹配实现

 

2. Java枚举实现

Java枚举实现有限状态机

 

3. 设计模式:状态模式实现

 

4. 使用stateless4j实现

github地址:https://github.com/stateless4j/stateless4j

 

 

5. Spring Statemachine实现

github地址:https://github.com/spring-projects/spring-statemachine

 

 

6. Akka FSM 状态机实现

github地址:https://github.com/akka/akka

 

 7. 经过squirrel-foundation实现

github地址:https://github.com/hekailiang/squirrel

相关文章
相关标签/搜索