前段时间写了一篇文章描述FSM(有限状态机),但是在有些情况下业务比较复杂,就会使用到HFSM(层次状态机),使用层次状态机,将复杂的业务分解为几个大状态,每个大状态再维护自身内部的小状态,可以使代码更加条理,增加代码的可读性与可维护性

1、层次状态机思想

类似于FSM,层次状态机也具有这几个部分:状态、事件、转换、运行。

  • 状态(State):系统或程序可能处于的不同状态,例如"待机"、"运行"、"暂停"等。每个状态代表了系统或程序的一种行为或模式。
  • 事件(Event):触发状态转换的信号或条件,可以是外部输入、定时器到期、传感器触发等。事件发生时,状态机将根据当前状态和事件来确定下一个状态。
  • 转换(Transition):状态之间的切换过程,由事件触发。每个转换定义了从一个状态到另一个状态的条件和操作。在HFSM中,同等级之间的状态才可以转换。
  • 动作(Action):状态转换时执行的操作或任务,例如更新变量、调用函数、发送消息等。动作可以在转换时执行,也可以在进入或离开某个状态时执行。

但是相比于FSM,HFSM多了几个概念:同等级状态转移、事件传递、多层动作执行

  • 同等级状态转移:只有同等级的状态之间才可以进行状态转移
  • 事件传递:子状态无法处理的事件,需要传递给父状态处理
  • 多层动作执行:动作执行先从顶层状态任务开始执行,并且递归执行其子状态的任务

2、框架图示例

下图是一个洗衣机的多层次状态机模型图,相比于FSM的洗衣机功能丰富很多,具有空闲、快洗、精洗、烘干西、单烘干几种模式,每种模式功能详细,但是具体内部的处理方式不同,使用层次状态机可以较为方便的管理所有状态

下图制作匆忙,与业务强相关的部分跳转与时间未绘制

HFSM.jpg

3、层次状态机组件推荐

  • QPN:国外使用很多,但是开源项目中国内使用较少
  • 自主开发:将原理理清楚,自行编码
文章目录