?策略模式(Strategy Pattern)是一種 ??行為型設計模式??,用于動態切換算法或策略??,使得算法可以獨立于客戶端變化。它通過封裝算法策略并使其可互換,提升了系統的靈活性和擴展性,尤其適用于需要多種算法變體或需要避免使用復雜條件分支的場景。
優點:
????1.符合開閉原則??
??擴展性??:新增策略時無需修改現有代碼,只需添加新的策略類。
??維護性??:修改某個策略的實現不會影響其他策略或上下文邏輯。
??2.消除復雜條件分支??
避免大量 if-else 或 switch 語句,代碼更簡潔清晰。
3.??算法復用??
同一策略可被多個上下文對象復用(如多個敵人共享同一個追擊策略)。
??4.動態切換行為??
運行時靈活切換策略(如根據游戲難度動態調整敵人AI)。
缺點:
1.??類數量膨脹??
每個策略對應一個類,可能導致類數量過多(例如10種移動策略 → 10個類)。
??優化??:使用工廠模式或ScriptableObject統一管理策略創建。
2.??客戶端需了解策略差異??
客戶端需要知道不同策略的存在及其適用場景,可能增加使用復雜度。
??優化??:通過配置文件或策略工廠隱藏策略實現細節。
??3.過度設計風險??
簡單算法(如單一固定行為)使用策略模式可能增加不必要的復雜性。
??4.性能開銷??
高頻切換策略可能導致對象創建/銷毀開銷(如每幀切換策略)。
??優化??:將無狀態的策略類設為單例,或使用對象池復用策略實例。
說明例子:
1.UML類圖:
2.實現:
1.定義策略基類:
public abstract class Strategy
{public abstract void AlgorithmInterface();
}
2.定義策略上下文類:
public class StrategyContext{Strategy m_strategy = null;//設置算法public void SetStrategy(Strategy strategy){m_strategy = strategy;}//執行當前算法public void ContextInterface(){m_strategy.AlgorithmInterface();}}
3.定義具體策略類:
public class ConcreteStrategyA : Strategy{public override void AlgorithmInterface(){Debug.Log("ConcreateStrategyA.AlgorithmInterface");}}public class ConcreteStrategyB : Strategy{public override void AlgorithmInterface(){Debug.Log("ConcreateStrategyB.AlgorithmInterface");}}public class ConcreteStrategyC : Strategy{public override void AlgorithmInterface(){Debug.Log("ConcreateStrategyC.AlgorithmInterface");}}
4.測試類:
public class StrategyPattern : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){StrategyContext context = new StrategyContext();//設置算法context.SetStrategy(new ConcreteStrategyA());context.ContextInterface();context.SetStrategy(new ConcreteStrategyB());context.ContextInterface();context.SetStrategy(new ConcreteStrategyC());context.ContextInterface();}
}
游戲中使用場景:
??1.AI行為系統??
??敵人移動策略??:追擊、繞后、隨機游走、巡邏路徑。
??攻擊策略??:近戰連擊、遠程射擊、投擲炸彈、召喚援軍。
2.??技能/武器系統??
??武器開火模式??:點射、連發、散射、蓄力攻擊。
??技能釋放邏輯??:單體鎖定、區域AOE、鏈式彈射。
??3.傷害計算系統??
??傷害公式??:物理傷害、魔法傷害、真實傷害(無視防御)。
??抗性計算??:不同屬性(火、冰、毒)使用獨立的抗性策略。
4.??游戲難度調整??
??簡單難度??:敵人使用保守策略(低攻擊頻率、低傷害)。
??困難難度??:敵人使用激進策略(高攻擊頻率、包圍戰術)。
總結:
策略模式通過解耦算法實現與使用??,為游戲開發提供了高度靈活的決策系統,尤其適用于需要動態切換行為或維護多種算法變體的場景,其核心價值在于提升代碼可維護性?、增強擴展性??。
參考書籍:
《Hands-On Game Development Patterns with Unity 2019》
《設計模式與游戲完美開發》