PSF(有限状态机的实现方法)

1:switch case/if else设计方法

  curEvent = getEvent();

  curState = getCurState();

  switch(curState){

     case  state1:{

         switch(curEvent){

             TODO...

            setCurEvent();

            break;

    }

    break;

  }

....

}

这种设计方法最简单,通过一大堆判断来处理,适合小规模的状态切换流程,但如果规模扩大难以扩展和维护。

2:基于表结构的状态机设计方法:建立相应的状态表和动作查询表,根据状态表、事件、动作表定位相应的动作处理函数,执行完成后再进行状态的切换。

一个通用的状态机处理模块的设计如下

/*状态表注册*/
void FSM_Regist(FSM_T* pFsm,STATE_TABLE_S* pStateTable)
{
   pFsm->FsmTable =  pStateTable;
   return;
}
/*状态迁移*/
void FSM_MoveState(FSM_T* pFsm,int state)
{
   pFsm->curState = state;
   return;
}
/*事件处理*/
void FSM_EventHandle(FSM_T* pFsm,int event)
{
    ACT_TABLE_T* pActTable = NULL;
    ActFun eventActFun = NULL;
    /*获取当前状态动作表*/
    pActTable = FSM_getActTable(pFsm);
    /*获取当前动作函数*/
    for(int i=0;i     {
        if(event == pActTable[i].event)
        {
            eventActFun = pActTable[i].eventActFun;
            break;
        }
    }
    /*动作执行*/
    if(eventActFun)
    {
        eventActFun(pFsm);
    }
}

相应的状态机设置如下:

/*状态1的动作表*/
ACT_TABLE_T state1ActTable[] = {
    {EVENT1,state1Event1Fun},
    {EVENT3,state1Event3Fun},
};
/*状态2的动作表*/
ACT_TABLE_T state2ActTable[] = {
    {EVENT2,state2Event2Fun},
};
/*状态表*/
STATE_TABLE_T FsmTable[] = {
    {STATE1,state1ActTable},
    {STATE2,state2ActTable},
};


int main(int argc, _TCHAR* argv[])
{
    FSM_T fsm;
    /*状态表注册*/
    FSM_Regist(&fsm,FsmTable);
    FSM_MoveState(&fsm,STATE1);
    FSM_EventHandle(&fsm,EVENT1);
    FSM_EventHandle(&fsm,EVENT2);
    return 0;
}
/*客户端提供的状态处理函数*/
void state1Event1Fun(void* pFsm)
{
    FSM_MoveState((FSM_T*)pFsm,STATE2);
    return;
}
void state1Event3Fun(void* pFsm)
{
    FSM_MoveState((FSM_T*)pFsm,STATE3);
    return;
}
void state2Event2Fun(void* pFsm)
{
    FSM_MoveState((FSM_T*)pFsm,STATE3);
    return;
}

你可能感兴趣的:(PSF(有限状态机的实现方法))