简单有限状态机(FSM)

    技术2025-04-24  20

    // 简单有限状态机(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; }

    最新回复(0)