策略模式 (Strategy Pattern)是一种 行为型设计模式,用于动态切换算法或策略,使得算法可以独立于客户端变化。它通过封装算法策略并使其可互换,提升了系统的灵活性和扩展性,尤其适用于需要多种算法变体或需要避免使用复杂条件分支的场景。
优点:
1.符合开闭原则
扩展性:新增策略时无需修改现有代码,只需添加新的策略类。
维护性:修改某个策略的实现不会影响其他策略或上下文逻辑。
2.消除复杂条件分支
避免大量 if-else 或 switch 语句,代码更简洁清晰。
3.算法复用
同一策略可被多个上下文对象复用(如多个敌人共享同一个追击策略)。
4.动态切换行为
运行时灵活切换策略(如根据游戏难度动态调整敌人AI)。
缺点:
1.类数量膨胀
每个策略对应一个类,可能导致类数量过多(例如10种移动策略 → 10个类)。
优化:使用工厂模式或ScriptableObject统一管理策略创建。
2.客户端需了解策略差异
客户端需要知道不同策略的存在及其适用场景,可能增加使用复杂度。
优化:通过配置文件或策略工厂隐藏策略实现细节。
3.过度设计风险
简单算法(如单一固定行为)使用策略模式可能增加不必要的复杂性。
4.性能开销
高频切换策略可能导致对象创建/销毁开销(如每帧切换策略)。
优化:将无状态的策略类设为单例,或使用对象池复用策略实例。
说明例子:
1.UML类图:

2.实现:
1.定义策略基类:
cs
public abstract class Strategy
{
public abstract void AlgorithmInterface();
}
2.定义策略上下文类:
cs
public class StrategyContext
{
Strategy m_strategy = null;
//设置算法
public void SetStrategy(Strategy strategy)
{
m_strategy = strategy;
}
//执行当前算法
public void ContextInterface()
{
m_strategy.AlgorithmInterface();
}
}
3.定义具体策略类:
cs
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.测试类:
cs
public class StrategyPattern : MonoBehaviour
{
// Start is called before the first frame update
void 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》
《设计模式与游戏完美开发》