有限状态机/FSM
有限狀態(tài)機(jī)(FSM)的設(shè)計(jì)與實(shí)現(xiàn)(一)
有限狀態(tài)機(jī)(FSM)是表示有限個(gè)狀態(tài)及在這些狀態(tài)之間的轉(zhuǎn)移和動(dòng)作等行為的數(shù)學(xué)模型,在計(jì)算機(jī)領(lǐng)域有著廣泛的應(yīng)用。通常FSM包含幾個(gè)要素:狀態(tài)的管理、狀態(tài)的監(jiān)控、狀態(tài)的觸發(fā)、狀態(tài)觸發(fā)后引發(fā)的動(dòng)作。本文主要闡述一下狀態(tài)機(jī)的幾種設(shè)計(jì)方法。
1:switch case/if else設(shè)計(jì)方法
curEvent = getEvent(); curState = getCurState(); switch(curState) {case state1:{switch(curEvent ){TODO...setCurState();break; }break;}... }這種設(shè)計(jì)方法最簡(jiǎn)單,通過(guò)一大堆判斷來(lái)處理,適合小規(guī)模的狀態(tài)切換流程,但如果規(guī)模擴(kuò)大難以擴(kuò)展和維護(hù)。
2:基于表結(jié)構(gòu)的狀態(tài)機(jī)設(shè)計(jì)方法:建立相應(yīng)的狀態(tài)表和動(dòng)作查詢表,根據(jù)狀態(tài)表、事件、動(dòng)作表定位相應(yīng)的動(dòng)作處理函數(shù),執(zhí)行完成后再進(jìn)行狀態(tài)的切換。
一個(gè)通用的狀態(tài)機(jī)處理模塊的設(shè)計(jì)如下:
/*狀態(tài)表注冊(cè)*/void FSM_Regist(FSM_T* pFsm,STATE_TABLE_S* pStateTable) {pFsm->FsmTable = pStateTable;return; } /*狀態(tài)遷移*/ 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;/*獲取當(dāng)前狀態(tài)動(dòng)作表*/pActTable = FSM_getActTable(pFsm);/*獲取當(dāng)前動(dòng)作函數(shù)*/for(int i=0;i<MAX_ACT_NUM;i++){if(event == pActTable[i].event){eventActFun = pActTable[i].eventActFun;break;}}/*動(dòng)作執(zhí)行*/if(eventActFun){eventActFun(pFsm);} }
假設(shè)我們的狀態(tài)圖如下:
相應(yīng)的狀態(tài)機(jī)設(shè)置如下:
/*客戶端提供的狀態(tài)處理函數(shù)*/ 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; }
通過(guò)設(shè)計(jì)一個(gè)通用的基于表結(jié)構(gòu)的狀態(tài)機(jī)模塊,針對(duì)不同的狀態(tài)圖,我們只需要根據(jù)狀態(tài)圖得到其狀態(tài)表結(jié)構(gòu),然后通過(guò)FSM_Regist注冊(cè),就可以方便的使用了狀態(tài)機(jī)的功能了。這種機(jī)制便于我們添加新的狀態(tài)流程,并且可以很好的進(jìn)行分層狀態(tài)機(jī)的設(shè)計(jì)。
轉(zhuǎn)載請(qǐng)注明原始出處:http://www.cnblogs.com/chencheng/archive/2012/06/25/2562660.html
總結(jié)
- 上一篇: osg学习博客
- 下一篇: TCP为什么是四次挥手