设计模式——Template Method(模板方法)

目录

  • 前言
  • 1 定义
  • 2 适用性
  • 3 结构
    • 3.1 结构图
    • 3.2 参与者
  • 4 Spring应用举例
    • 4.1 AbstractClass——AbstractApplicationContext
    • 4.2 ConcreteClass——GenericWebApplicationContext
  • 5 总结
  • 参考文献

前言

当需要定义一个算法的框架,但是有些步骤,可能需要随着情景发生变化时,如果借助子类可能来封装可能产生大量子类重复代码。而模板方法可以帮助我们抽象公共逻辑,子类实现特定逻辑。

1 定义

Template Method(模板方法):使用抽象的操作定义一个算法,实现其中不变的部分,将经常变化的交给子类去实现。

2 适用性

  • 当你需要扩展一个算法特定部分,不需要改变全部框架结构。
  • 当多个算法大框架类似,只有部分内容根据情景不同,可以抽象使用模板方法。

3 结构

3.1 结构图

模板方法结构图如下:
设计模式——Template Method(模板方法)_第1张图片

3.2 参与者

  • AbstractClass:抽象类,负责算法大的框架,实现公共不需要改变的步骤。
  • ConcreteClass:具体子类,负责算法中特定逻辑,从而通过使用抽象类完成一个完整算法。

4 Spring应用举例

模板方法示例较多比如java并发中API层面的锁的支持者:

  • AbstractQueuedSynchronizer大量使用了模板方法。
  • Spring中AbstractApplicationContext中refresh方法也使用了模板方法,留给了子类扩展的地方。

AbstractApplicationContext为例

4.1 AbstractClass——AbstractApplicationContext

该抽象上下文refresh方法如下:
设计模式——Template Method(模板方法)_第2张图片
onRefresh定义如下:

	/**
	 * Template method which can be overridden to add context-specific refresh work.
	 * Called on initialization of special beans, before instantiation of singletons.
	 * 

This implementation is empty. * @throws BeansException in case of errors * @see #refresh() */ protected void onRefresh() throws BeansException { // For subclasses: do nothing by default. }

4.2 ConcreteClass——GenericWebApplicationContext

GenericWebApplicationContext中实现具体需要提前进行创建的bean,该方法实现如下:

	/**
	 * Initialize the theme capability.
	 */
	@Override
	protected void onRefresh() {
		this.themeSource = UiApplicationContextUtils.initThemeSource(this);
	}

该方法就是提前创建主题资源themeSource的bean。

5 总结

当需要将子类重复步骤提到抽象类时可以采用,但是如果模板方法步骤太多可能维护困难,需要考虑。

参考文献

[1]. 《设计模式》
[2]. 模板方法设计方法

你可能感兴趣的:(设计模式,java,后端,设计模式,模板方法模式)