🧠
一句话理解:策略模式把一组可互换的算法封装成独立对象,让上下文通过组合选择行为,而不是堆叠条件分支。

它解决什么问题

角色攻击可能随武器、职业或状态变化。若所有逻辑都写进一个 switch,每增加一种算法都要修改核心类。策略把变化的算法抽离,并保持统一调用方式。

Unity 示例:可配置攻击策略

用抽象 ScriptableObject 可以直接在 Inspector 中选择策略资产:
同一个 CombatController 可以使用近战、远程或范围攻击资产,也可在运行时切换。

设计要点

  • 策略应聚焦一个算法边界,不要同时管理 UI、存档和生命周期。
  • 上下文负责提供必要数据,策略不应反向查找大量全局对象。
  • 无状态策略可以共享;包含运行时可变状态时,应为每个使用者创建独立实例。
  • 纯算法优先使用普通 C# 类,只有需要 Inspector 配置或资产复用时才使用 ScriptableObject

与状态模式的区别

策略通常由外部选择,用来替换“怎么做”;状态模式根据对象内部状态决定“当前允许做什么”,并管理状态转换。两者结构相似,意图不同。

适用与边界

适合伤害公式、寻路评分、目标选择、排序和输入映射。若只有两个稳定分支,简单条件语句往往更易读。

小结

策略模式的核心收益是把算法变化与使用算法的对象分离。先找到真正会独立变化的算法,再决定是否抽象。