| name | metaframe-template-method-pattern |
|---|---|
| category | engineering |
| description | 模板方法模式 | Code & Engineering |
英文名: Template Method Pattern
分类: 编码实践
作者: Gamma, Helm, Johnson, Vlissides, 1994
复杂度: beginner
成熟度: foundational
AI 相关: ❌ 否
在基类中定义算法骨架,允许子类覆盖特定步骤而不改变算法整体结构
- 模板方法:在基类中定义为 final 方法的不变算法骨架,负责编排对基本操作的调用
- 基本操作:代表算法可变部分的抽象方法或钩子方法;子类通过覆盖这些方法来专门化行为
- 好莱坞原则:基类调用子类方法,而非反过来——高层组件控制流程,低层组件填充细节
- 定义抽象基类:将模板方法声明为 final(不可覆盖)方法,按正确顺序调用一系列基本操作
- 识别基本操作:将算法拆分为步骤——将必须实现的步骤标记为抽象方法,可选步骤标记为带默认实现的钩子方法
- 实现具体子类:只覆盖不同的基本操作,保持基类中的整体算法结构不变
- 使用钩子方法实现可选行为:在基类中提供空的或无操作的钩子实现,使子类可以在定义的扩展点选择性地扩展行为
- 当可变性增长时倾向组合:当可覆盖步骤数量激增时,考虑用注入单一模板类的策略对象替代继承
['多个子类共享相同的算法结构,但在一个或多个具体步骤上有所不同', '需要强制执行固定的操作顺序,同时允许在特定扩展点灵活处理', '通过将不变部分提取到公共基类中,消除相关类之间的代码重复']
- 将模板方法声明为 final,防止子类意外破坏算法不变量
- 最小化抽象步骤的数量,减少具体子类的实现负担
- 记录每个基本操作的预期契约,使子类作者了解必须保持哪些不变量
- 不要在子类中覆盖模板方法——这样做违背了模式的整体目的,导致算法变体分歧
- 不要使用模板方法创建深度继承层次结构,因为随着层次结构的增长,它们会变得脆弱且难以理解
- 当可变行为与共享算法结构无关时,不要使用模板方法——策略组合更为合适
Sources: SDFrame (Software Design) MetaFrame: 💻 Code & Engineering / 编码与工程