📐
一句话理解:模板方法在基类中定义算法骨架,把部分步骤交给子类实现,同时保证整体流程和调用顺序不变。

它解决什么问题

多个关卡都遵循“加载、准备、运行、结算、清理”,但个别步骤不同。复制完整流程会产生重复;让每个子类自由编排又容易漏步骤。模板方法把稳定流程放在基类,只开放必要变化点。

C# 示例:关卡流程

具体关卡实现必需步骤,并按需覆盖钩子:
调用方只执行 RunAsync,无法意外打乱流程。

抽象步骤与钩子

  • 抽象步骤:子类必须实现,是流程不可缺少的变化点。
  • 钩子:基类提供默认实现,子类可选择覆盖。
变化点越多,基类与子类之间的隐式协议越复杂。只开放确实需要变化的步骤。

与策略模式的区别

模板方法通过继承替换流程中的局部步骤,整体顺序由基类固定;策略通过组合替换完整算法,运行时切换更容易。Unity 项目强调组合时,策略通常更灵活;当流程骨架非常稳定时,模板方法更直接。

风险

深继承层级、脆弱基类和难以理解的调用顺序是主要问题。模板方法应短小,并清楚记录每个钩子的调用时机。

小结

模板方法适合“流程相同、少数步骤不同”的场景。若连步骤顺序都经常变化,应改用组合、管线或状态机。