zoukankan      html  css  js  c++  java
  • 有限状态机FSM(Finite State Machine)及实现方式介绍

    一、为什么引入有限状态机?

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

    二、什么是有限状态机?

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

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

     

                                                     图1:状态转换图

    说明:

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

    1. 状态机要素

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

                                                           图2:状态转换表

    2. 有限状态机表示方法

    ①状态转换图,例如图1

    ②状态转换表,例如图2

     三、有限状态机实现方式

    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

    自己做了些实例及封装:https://github.com/barrywang88/fsm

  • 相关阅读:
    openstack nova创建虚拟机过程(DEBUG)从接收到cli RESTFul请求到给scheduler发送rpc消息
    openstack源码阅读基础:openstack中Nova组件RESTful请求的具体处理函数确定
    博客园第一搏——Html5 JumpStart学习笔记1:Semantic Structure
    我的CSDN博客http://blog.csdn.net/kuangjian007,欢迎骚扰!
    django第一课:基本介绍
    pku 1142 Smith Number
    使用Eclipse开发X3D
    javascript树形控件第二版
    三种方式获得int的size
    细节决定成败
  • 原文地址:https://www.cnblogs.com/barrywxx/p/12860573.html
Copyright © 2011-2022 走看看