狀態(tài)機模式非常簡單,實際上任何一個類就是一個狀態(tài)機模式。
class A{ public: void fun(int a,int b); }
任何一個類的成員函數(shù)(靜態(tài)成員函數(shù)除外)都包含一個this指針指向一個本類對象。
事實上,A a;聲明一個對象的時候,成員函數(shù)和其中的成員變量并不在同一個地方,正是因為有了this指針,成員函數(shù)才能操縱成員變量。
狀態(tài)機模式
本來所有的狀態(tài)的切換全部都是在一個類(譬如A類)中,但是因為如果狀態(tài)很多,狀態(tài)切換的函數(shù)就會變得很復雜。所以將這部分全部拉了出來,單獨寫成state類。
class A{ public: void changeState(State* state); //一般來說類狀態(tài)的改變邏輯寫在這個函數(shù)里,使用狀態(tài)模式之后,寫在狀態(tài)類中 void update(float dt); state* mCurState; //標志當前的狀態(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); }