模板方法模式定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤
结构
参与者
- AbstractClass(抽象类) — 定义抽象的原语操作,具体的子类将重定义它们以实现一个算法的各步骤
- ConcreteClass(具体类) — 定义抽象的原语操作,具体的子类将重定义它们以实现一个算法的各步骤
抽象类的拓展方式
- 抽象方法
- final修饰的方法
- 空的实体方法,由子类决定是否覆盖(钩子方法)
好莱坞法则
好莱坞法则即“别找我们,我们找你”,指一个父类调用一个子类的操作,而不是相反,这导致了一种反向的控制结构
适用场景
- 业务拥有相近的流程或步骤但每个流程或步骤的具体实现不同
- 需要控制子类的扩展(只允许子类通过实现原语方法或者覆写钩子方法进行拓展)
优点
- 将各子类中的行为提取出来集中到公共父类中可避免代码重复
- 拓展新的子类时只需关心怎样实现原语方法和是否需要覆写钩子方法
缺点
- 当模板中定义的骨架无法与某个子类的业务流程相斥的时候模板方法模式的优势就会荡然无存
与策略模式的区别
- 策略模式使用组合,模板方法模式使用继承
- 策略模式着眼于同一类算法的不同实现,模板方法模式着眼于每一个算法的相似步骤