设计模式 --- 策略模式

​策略模式 (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》

《设计模式与游戏完美开发》

相关推荐
笨手笨脚の3 小时前
设计模式-策略模式
设计模式·策略模式·行为型设计模式
王嘉俊9253 小时前
设计模式--适配器模式:优雅解决接口不兼容问题
java·设计模式·适配器模式
王嘉俊9253 小时前
设计模式--组合模式:统一处理树形结构的优雅设计
java·设计模式·组合模式
rongqing20193 小时前
Google 智能体设计模式:多智能体协作
设计模式
李广坤18 小时前
状态模式(State Pattern)
设计模式
李广坤20 小时前
观察者模式(Observer Pattern)
设计模式
李广坤21 小时前
中介者模式(Mediator Pattern)
设计模式
李广坤21 小时前
迭代器模式(Iterator Pattern)
设计模式
李广坤21 小时前
解释器模式(Interpreter Pattern)
设计模式
阿无,1 天前
java23种设计模式之前言
设计模式