定义
在一个方法中定义一个算法的骨架,将一些步骤延迟到子类中。模板方法使得子类可以不改变算法结构的情况下,重新定义算法中的某些步骤。
优点
- 模板类主导一切,拥有且保护算法。算法修改方便。
- 新增加一个实现类,只需要重写自己的方法就可以了。
- 模板类专注算法本身,由子类提供完整的实现。
定义一个模板
/**
* 定义的抽象类,它被声明为抽象,作为基类
*/
public abstract class AbstractClass {
/**
* 模板方法,定义了该方法包含的一连串操作
*/
final void templateMethod(){
primitiveOperation1();
primitiveOperation2();
concreteOperation1();
concreteOperation2();
}
/**
* 操作1:需子类实现具体操作
*/
abstract void primitiveOperation1();
/**
* 操作2:需子类实现具体操作
*/
abstract void primitiveOperation2();
/**
* 具体方法,子类无法重写
*/
final void concreteOperation1(){
//do something
}
/**
* 具体方法,子类视情况是否重写
*/
void concreteOperation2(){
//do something
}
}
模板中增加钩子
钩子是以重被声明在抽象类中的方法,可以让子类有能力对算法的不同点进行挂钩。
/**
* 定义的抽象类,它被声明为抽象,作为基类
*/
public abstract class AbstractClassWithHook {
/**
* 模板方法,定义了该方法包含的一连串操作
*/
final void templateMethod(){
primitiveOperation1();
primitiveOperation2();
concreteOperation1();
//满足某条件才执行操作2
if (matchAnyCondition()) {
concreteOperation2();
}
}
/**
* 操作1:需子类实现具体操作
*/
abstract void primitiveOperation1();
/**
* 操作2:需子类实现具体操作
*/
abstract void primitiveOperation2();
/**
* 具体方法,子类无法重写
*/
final void concreteOperation1(){
//do something
}
/**
* 具体方法,子类视情况是否重写
*/
void concreteOperation2(){
//do something
}
/**
* 自定义的钩子,子类可以覆盖这个方法,根据实际条件返回true or false
* @return
*/
boolean matchAnyCondition() {
//return true or false,子类可以重写
return true;
}
}
【参考】
[1] Head First 设计模式
[2] https://github.com/iluwatar/java-design-patterns/tree/master/template-method