狀態(tài)機(jī)模式非常簡單,實(shí)際上任何一個類就是一個狀態(tài)機(jī)模式。
class A{ public: void fun(int a,int b); }
任何一個類的成員函數(shù)(靜態(tài)成員函數(shù)除外)都包含一個this指針指向一個本類對象。
事實(shí)上,A a;
聲明一個對象的時候,成員函數(shù)和其中的成員變量并不在同一個地方,正是因?yàn)橛辛藅his指針蚤假,成員函數(shù)才能操縱成員變量。
狀態(tài)機(jī)模式
本來所有的狀態(tài)的切換全部都是在一個類(譬如A類)中吧兔,但是因?yàn)槿绻麪顟B(tài)很多磷仰,狀態(tài)切換的函數(shù)就會變得很復(fù)雜。所以將這部分全部拉了出來境蔼,單獨(dú)寫成state類灶平。
class A{ public: void changeState(State* state); //一般來說類狀態(tài)的改變邏輯寫在這個函數(shù)里,使用狀態(tài)模式之后箍土,寫在狀態(tài)類中 void update(float dt); state* mCurState; //標(biāo)志當(dāng)前的狀態(tài) }
class State{ //某一個狀態(tài)下逢享,要執(zhí)行的行為。注意其中有指向類A的指針(這就是關(guān)鍵) virtual void excute(A* a) = 0; }
所以A添加的任何一個狀態(tài)吴藻,只需繼承State類瞒爬,并重寫excute函數(shù)即可。在excute函數(shù)中寫本狀態(tài)要執(zhí)行的邏輯沟堡。
而類A的update只需:
void A::update(float dt){ mCurState->excute(this); }