- 前言
- 1 定义
- 2 适用性
- 3 结构
- 3.1 结构图
- 3.2 参与者
- 4 Spring应用举例
- 4.1 AbstractClass——AbstractApplicationContext
- 4.2 ConcreteClass——GenericWebApplicationContext
- 5 总结
- 参考文献
当需要定义一个算法的框架,但是有些步骤,可能需要随着情景发生变化时,如果借助子类可能来封装可能产生大量子类重复代码。而模板方法可以帮助我们抽象公共逻辑,子类实现特定逻辑。
1 定义Template Method(模板方法):使用抽象的操作定义一个算法,实现其中不变的部分,将经常变化的交给子类去实现。
2 适用性- 当你需要扩展一个算法特定部分,不需要改变全部框架结构。
- 当多个算法大框架类似,只有部分内容根据情景不同,可以抽象使用模板方法。
模板方法结构图如下:
- AbstractClass:抽象类,负责算法大的框架,实现公共不需要改变的步骤。
- ConcreteClass:具体子类,负责算法中特定逻辑,从而通过使用抽象类完成一个完整算法。
模板方法示例较多比如java并发中API层面的锁的支持者:
- AbstractQueuedSynchronizer大量使用了模板方法。
- Spring中AbstractApplicationContext中refresh方法也使用了模板方法,留给了子类扩展的地方。
以AbstractApplicationContext为例
4.1 AbstractClass——AbstractApplicationContext该抽象上下文refresh方法如下:
onRefresh定义如下:
protected void onRefresh() throws BeansException {
// For subclasses: do nothing by default.
}
4.2 ConcreteClass——GenericWebApplicationContext
GenericWebApplicationContext中实现具体需要提前进行创建的bean,该方法实现如下:
@Override
protected void onRefresh() {
this.themeSource = UiApplicationContextUtils.initThemeSource(this);
}
该方法就是提前创建主题资源themeSource的bean。
5 总结当需要将子类重复步骤提到抽象类时可以采用,但是如果模板方法步骤太多可能维护困难,需要考虑。
参考文献[1]. 《设计模式》
[2]. 模板方法设计方法



