最近作一个项目,项目中不少实体(Entity),每一个实体都有不少状态(State),各状态会通过不一样事件(Event)触发后转换到另外一个状态。这些事件包括但不限于:用户页面点击触发,生效时间或失效时间到达,其余依赖实体状态变动等。在状态变动后还会有一系列动做(Action)处理。一旦相互依赖实体或实体自己状态增多,状态转换变多,处理这些状态的业务代码也会分散在各处,代码处理很容易漏掉,维护成本很高。因此考虑引入有限状态机。html
有限状态机,也称为FSM(Finite State Machine),其在任意时刻都处于有限状态集合中的某一状态。当其得到一个输入字符时,将从当前状态转换到另外一个状态,或者仍然保持在当前状态。任何一个FSM均可以用状态转换图来描述,图中的节点表示FSM中的一个状态,有向(方向表示从一个初态转换到次态)加权(权表示事件)边表示输入字符时状态的变化。若是图中不存在与当前状态与输入字符对应的有向边,则FSM将进入“消亡状态(Doom State)”,此后FSM将一直保持“消亡状态”。状态转换图中还有两个特殊状态:状态1称为“起始状态”,表示FSM的初始状态。状态6称为“结束状态”。git
在启动一个FSM时,首先必须将FSM置于“起始状态”,而后触发一系列时间,最终,FSM会到达“结束状态”或者“消亡状态”。github
图1:状态转换图spring
说明:设计模式
在一般的FSM模型中,通常还存在一个“接受状态”,而且FSM能够从“接受状态”转换到另外一个状态,只有在识别最后一个字符后,才会根据最终状态来决定是否接受所输入的字符串。此外,也能够将“其实状态”也做为接受状态,所以空的输入序列也是能够接受的。less
状态机可概括为4个要素,即现态、条件、动做、次态。“现态”和“条件”是因,“动做”和“次态”是果。详解以下:
①现态:是指当前所处的状态。
②条件:又称为“事件”。当一个条件被知足,将会触发一个动做,或者执行一次状态的迁移。
③动做:条件知足后执行的动做。动做执行完毕后,能够迁移到新的状态,也能够仍旧保持原状态。动做不是必需的,当条件知足后,也能够不执行任何动做,直接迁移到新状态。
④次态:条件知足后要迁往的新状态。“次态”是相对于“现态”而言的,“次态”一旦被激活,就转变成新的“现态”了。
咱们能够用状态表了表示整个过程,以下图所示。post
图2:状态转换表ui
①状态转换图,例如图1url
②状态转换表,例如图2设计
github地址:https://github.com/stateless4j/stateless4j
github地址:https://github.com/spring-projects/spring-statemachine
github地址:https://github.com/akka/akka
github地址:https://github.com/hekailiang/squirrel