// 简单有限状态机(FSM) // 有限状态自动机是一个五元组: // 状态的非空有穷集合,输入字母表,状态转移函数,初始状态,终止状态集合
// 复杂的状态机构造,可以使用 boost StateChart 库 // VC2008
// 一个实际使用的状态机, 它的状态可能不能用一个类似整数这样的简单数据表示,并同时具有内部状态 // 则我们需要用一组对象的来表示这些状态, 并用一个指向他们的指针来表示"当前状态" // 通常,在较高的层次,我们仍然可以用一个整数来表示"当前状态",并用一个对应的对象来记录这个状态的细节数据 // 参考《设计模式》(GoF)的"状态模式(State)"
#include "stdafx.h"
// 状态 enum enState { enState_Open, enState_Close, };
// 输入事件 enum enEvent { enEvent_Open, enEvent_Close, };
// 状态转换信息 struct tagStateChange { enState m_newState; };
class FSM { public: // 初始状态 FSM(enState s0) : m_State(s0) {};
// 状态转移函数: 事件处理函数 bool HandleEvent(enEvent enE) { tagStateChange cE; switch(enE) { case enEvent_Open: cE.m_newState = enState_Open; break; case enEvent_Close: cE.m_newState = enState_Close; break; }
return ChangeState(cE); }
// 状态转移函数: 状态转换函数 bool ChangeState(const tagStateChange& changeInfo) { if(m_State == changeInfo.m_newState) return false;
m_State = changeInfo.m_newState; return true; }
// 终止状态 bool IsFinal() const { return (m_State == enState_Close); }
private: enState m_State; };
int _tmain(int argc, _TCHAR* argv[]) { FSM fsm(enState_Open); // 初始状态 fsm.HandleEvent(enEvent_Open); fsm.HandleEvent(enEvent_Close); fsm.HandleEvent(enEvent_Open); fsm.HandleEvent(enEvent_Open); fsm.HandleEvent(enEvent_Close);
bool bClose = fsm.IsFinal(); return 0; }