HSM - 分层状态机
一. 基础知识
1.1 从 FSM 到 HSM
1. FSM 有一个很大的局限性就是状态爆炸,有新增需求时需要维护所有状态
- 扁平结构:所有状态处于同一层级,无父子关系。 - 重复逻辑:通用事件(如 “急停”、“网络掉线”)需在每个状态中重复处理。 - 维护困难:修改全局逻辑需改动所有相关状态,易出错。
2. HSM 的解决方案:层级化
- 状态嵌套:将状态组织成树形结构,父状态定义通用行为,子状态实现具体逻辑。 - 事件冒泡:未被处理的事件自动向上传递给父状态,实现逻辑复用。 - 最小化转移:利用最近公共祖先(LCA)算法,仅切换必要的状态层级,提升效率。
结论:HSM 是 FSM 的超集,通过引入层级关系,解决了状态爆炸问题。
1.2 HSM的核心概念
1. 状态嵌套:
状态可以包含子状态,形成树形层级。
- 父状态:代表更抽象的概念,处理通用逻辑。 - 子状态:代表具体行为,继承父状态的逻辑。 - 叶子状态:没有子状态的末端状态,是状态机的实际活跃状态。
2. 事件冒泡:
事件从当前叶子状态开始,依次向上传递给父状态,直到被处理或到达根状态。
- 处理优先级:叶子状态 > 父状态 > 根状态。 - 核心价值:实现通用逻辑的统一处理,避免代码冗余。
3. LCA
最近公共祖先 (LCA) 转移 状态转移时,计算新旧状态链的最近公共祖先,仅退出旧链中 LCA 以下的状态,进入新链中 LCA 以下的状态。 避免重复进入 / 退出公共父状态,提升效率,保证状态切换的原子性
