狀態模式??是一種??行為型設計模式??,允許對象在內部狀態改變時動態改變其行為??,使對象的行為看起來像是改變了。該模式通過將狀態邏輯拆分為獨立類??,消除復雜的條件分支語句,提升代碼的可維護性和擴展性。
狀態模式的核心價值??在于??解耦狀態邏輯與上下文??,為復雜狀態管理提供結構化解決方案。在游戲開發中,它尤其適合管理角色控制、AI行為等動態狀態流轉場景,但需權衡類膨脹和性能成本。
優點:
1. ??消除復雜條件分支:消除大量if-else或switch語句,避免代碼臃腫且難以維護,將每個分支獨立為一個狀態類,通過狀態切換取代條件分支。
2.提高擴展性:新增狀態無需修改上下文類,只需添加新的狀態類即可。
3.職責單一化:每個狀態類僅關注自身行為,符合單一職責原則。
4.狀態轉換顯式管理:狀態轉換條件封裝在狀態類中,避免分散在代碼各處。
5.提高可測試性:每個狀態可單獨測試,無需依賴其他邏輯。
缺點:?
1.類數量增多:每個狀態對應一個類,可能導致類數量過多。(例如10個狀態 → 10個類 + 接口 + 上下文類)
優化:
? ? ? ?1.?使用 ??層級狀態機?? 合并相似狀態(如 BaseMovementState 派生 Walk/Run)。
? ? ? ?2.對簡單狀態使用 ??枚舉 + 委托?? 簡化實現。
2.Context數據共享:狀態類需訪問上下文數據,可能導致過度暴露接口(如Player類需向狀態類公開血量、位置等字段)。
優化:
? ? ? ? 1.將共享數據封裝為 ??上下文接口??,限制訪問權限。
? ? ? ? 2.通過事件/委托通信,減少直接依賴。
3.性能開銷:頻繁創建/銷毀狀態對象可能影響性能(如每幀切換狀態)。
優化:
? ? ? ? ?1.使用??對象池??復用狀態實例。
說明例子:
1.UML類圖:
2.實現:
1.定義State的抽象類:
public abstract class State{protected Context m_Context = null;public State(Context _context){m_Context = _context;}public abstract void Handler(int value);}
2.定義Context類:
public class Context{State m_State = null;public void Request(int value){m_State.Handler(value);}public void SetState(State state){Debug.Log("Context.SetState:" + state);m_State = state;}}
3.定義具體狀態類:ConcreteStateA、ConcreteStateB、ConcreteStateC
public class ConcreteStateA : State{public ConcreteStateA(Context _context) : base(_context){}public override void Handler(int value){Debug.Log("ConcreteStateA.Handler");if (value > 10){m_Context.SetState(new ConcreateStateB(m_Context));}}}public class ConcreateStateB : State{public ConcreateStateB(Context _context) : base(_context){}public override void Handler(int value){Debug.Log("ConcreteStateB.Handler");if (value > 20){m_Context.SetState(new ConcreateStateC(m_Context));}}}public class ConcreateStateC : State{public ConcreateStateC(Context _context) : base(_context){}public override void Handler(int value){Debug.Log("ConcreteStateC.Handler");if (value > 30){m_Context.SetState(new ConcreteStateA(m_Context));}}}
4.測試類:
public class StateParttern : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){Context context = new Context();context.SetState(new ConcreteStateA(context));context.Request(5);context.Request(15);context.Request(25);context.Request(35);}
}
游戲中的使用場景:
??1.角色行為管理??:玩家狀態 --> 站立、移動、跳躍、攻擊、死亡。
??2.AI決策系統??:敵人AI --> 巡邏、追擊、攻擊、逃跑。
?3.?UI界面切換??:游戲菜單 --> 主界面、設置、背包、暫停。
4.場景切換:游戲場景 --> 開始場景、大廳場景、戰斗場景切換。
??5.物理交互系統??:物體狀態 --> 靜止、運動、碰撞、銷毀。
總結:
狀態模式的核心價值??在于解耦狀態邏輯與上下文??,為復雜狀態管理提供結構化解決方案。在游戲開發中,它尤其適合管理角色控制、AI行為等動態狀態流轉場景,但需權衡類膨脹和性能成本。
參考書籍:
《Hands-On Game Development Patterns with Unity 2019》
《設計模式與游戲完美開發》