设计模式 --- 策略模式

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

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

相关推荐
Cosolar7 小时前
提示词工程面试题系列 - Zero-Shot Prompting 和 Few-Shot Prompting 的核心区别是什么?
人工智能·设计模式·架构
geovindu14 小时前
go:Template Method Pattern
开发语言·后端·设计模式·golang·模板方法模式
钝挫力PROGRAMER14 小时前
贫血模型的改进
java·开发语言·设计模式·架构
qcx2316 小时前
Warp源码深度解析(二):自研GPU UI框架——WarpUI的ECH模式与渲染管线
人工智能·ui·设计模式·rust
qcx2317 小时前
Warp源码深度解析(三):Block-Based终端引擎——Grid模型、PTY与Shell Integration
人工智能·设计模式·架构·wrap
mounter62517 小时前
Linux Kernel Design Patterns (Part 2):从经典链表到现代 XArray,拆解内核复杂数据结构的设计哲学
linux·数据结构·链表·设计模式·内存管理·kernel
rrr217 小时前
【PyQt5】| 多线程设计模式
开发语言·qt·设计模式
SteveDraw17 小时前
常见的设计模式及工业场景下应用(更新中)
设计模式·c#·编码规范·gof23
ximu_polaris18 小时前
设计模式(C++)-行为型模式-状态模式
c++·设计模式·状态模式
ximu_polaris18 小时前
设计模式(C++)-行为型模式-迭代器模式
c++·设计模式·迭代器模式