和策略模式很类似,细微差别在于:策略是接口一致(处理的内容相同),实现不同;模板模式中有**“根据不同的处理对象”**这一潜在的需求。
定义一个操作中的**[1]算法骨架**,而将一些步骤的实现**[2]延迟到子类中**,使得子类可以不改变一个算法的结构即可重定义该算法的特定步骤以实现不同的操作。
- 算法骨架 + 延迟到子类
-
不变的部分在父类中一次性实现,变化的部分(被称为原语操作“PrimitiveOperation”)延迟到子类中实现。
-
父类中提供整合原语操作的接口(相当与策略模式的Context)
要素 策略是用“组合+委托”实现的,模板是用继承实现的。
- 公有的整合接口TemplateMethod
- 不想暴露PrimitiveOperation,声明为protected,并加前缀注明是变化的原语操作
- 建议用this指针调用原语操作
- 调用hook(钩子),这里暂不扩展
- 提取了算法的公共行为,并让变化的部分易于扩展
- 为同一行为提供不同的实现
- 继承是强约束,加剧了系统中的耦合。
- 原语操作过多的话会使重载的方法变多
- 一次性实现一个算法的不变部分,将可变部分留给子类通知
- 各子类中公共的行为提取出来避免代码重复.