文章目錄
- 28. 狀態模式
運行在VS2022,x86,Debug下。
28. 狀態模式
- 狀態模式讓一個對象的行為隨著內部狀態的改變而改變,而該對象也像換了類一樣。
- 應用:如在游戲開發中,游戲有不同場景,如主菜單、開始、戰斗等。可以使用狀態模式,定義一個場景狀態接口, 然后分別實現主菜單狀態類、開始狀態類、戰斗狀態類,實現游戲場景的切換。
- 實現
- 抽象狀態類,即定義狀態接口。
- 具體狀態類,即實現狀態接口。
- 上下文類,狀態控制者。
- 代碼如下。
//抽象狀態類:場景狀態接口
class SceneState
{
public:virtual void load() = 0;virtual void update() = 0;virtual void render() = 0;virtual void unload() = 0;
};//具體狀態類:主菜單狀態類
class MainMenuState :public SceneState
{
public:void load() { cout << "Loading main menu..." << endl; }void update() { cout << "Updating main menu..." << endl; }void render() { cout << "Rendering main menu..." << endl; }void unload() { cout << "Unloading main menu..." << endl; }
};//具體狀態類:戰斗狀態類
class BattleState :public SceneState
{
public:void load() { cout << "Loading battle scene..." << endl; }void update() { cout << "Updating battle scene..." << endl; }void render() { cout << "Rendering battle scene..." << endl; }void unload() { cout << "Unloading battle scene..." << endl; }
};//上下文類,狀態控制者
class Context
{
private:SceneState* currentState; //保存當前狀態public:Context(SceneState* initialState):currentState(initialState){}void setState(SceneState* state) //切換狀態{if (currentState) currentState->unload(); //切換狀態前先卸載當前狀態currentState = state;state->load(); //加載新狀態}void update() { currentState->update(); }void render() {currentState->render(); }};int main()
{MainMenuState mainMenu;BattleState batteScene;//從主菜單場景切換到戰斗場景Context context(&mainMenu); context.render();context.setState(&batteScene);context.update();context.render(); return 0;
}
注意 雖然策略模式和狀態模式看起來很像,但是關注點不同。
- 狀態模式強調對象狀態和行為之間的關聯。
- 策略模式強調算法之間的獨立性和可互換性。