设计模式-模板方法模式

对于模板设计模式,最重要的就是要理解模板方法, 模板方法将算法定义成一组步骤, 其中任何步骤都可以是抽象的, 由子类负责实现. 这样能够保证算法结构保持不变, 同时由子类提供部分实现.

详细描述

类图如下:

模板方法设计模式类图

其中templateMethod()就是模板方法, 而在模板方法中会使用primitiveOperation1()和primitiveOperation2()两个方法. 这两个方法会在不同的子类中有不同的实现. 具体代码如下:

abstract class AbstractClass {
	// 模板方法定义为final, 防止子类进行修改
	final void tempalteMethod() {
		primitiveOperation1();
		primitiveOperation2();
		concreteOperation();
		hook();
	}
}
// 这两个方法定义为抽象的,子类负责具体实现
abstract void primitiveOperation1();
abstract void primitiveOperation2();
// concreateOperation方法定义为final, 防止子类进行修改
final void concreteOperation() {
	// 具体实现
};
// 钩子方法, 可以留空,也可以有默认实现. 子类可以决定是否要进行覆盖.
void hook() {}

抽象类的代码如上, 模板方法中对应的关注点在代码注释中有详细说明. 代码中有hook()方法, 又被称作钩子方法. 钩子方法能够帮助我们修改模板方法中具体的执行逻辑. 因为hook()方法前面没有加入abstract关键字, 所以子类可以选择不实现.

具体实现

模板方法模式在很多框架中都有具体的使用, 比如Spring, JDK源码中的排序等. 这个模式让框架控制如何做事情, 而由使用框架的人来指定框架算法中每个步骤的细节.