有限状态自动机
通过“简单、优雅的方法去揭示和定义复杂系统的行为”,同样”提供了一个易于理解、易于修改的有效实现策略“,广泛适用于:GUI(如QT的state machine framework)、通信协议解析等。
一个状态机包含一个当前的状态、状态列表、状态迁移描述;状态迁移包含如下组成部分:起始状态、触发迁移的事件、终止状态、要执行的动作。
实现方式
1. 嵌套switch/case
表现为2层case判断状态、事件类型进行处理的结构,有限状态、少量事件情况下,最为有效的方法。
2. 解释迁移表
根据状态机持有的状态迁移表,处理所有事件内容,主要接口(C)包含:
// 根据状态迁移表创建状态机
FSM_M* fsmCreate(FSM_TRANSITION_TABLE* pTable);
// 状态机处理事件接口
int fsmEvtProc(FSM_M* pFsm);
相较于其他两种方式,如果事件执行的动作,需要进行状态迁移,并且迁出状态有多种的情况下,会引起状态表的膨胀。
3. STATE模式
与策略模式的差异:
STATE模式中,派生的实际状态类型可能会需要改变上下文状态,而策略模式中派生策略是看不到上下文类的。
关系:
“所有的STATE模式实例同样也是STRATEGY模式实例,但是并非所有的STRATEGY模式实例都是STATE模式实例。”[3]
***QT4支持
QT4的接口已然简洁许多,例子Two-way Button Example很容易上手体验。