知道一个算法所需的关键步骤,并确定了这些步骤的执行顺序,但是某些步骤的实现是未知的,或者说某些步骤的实现是会随着环境的变化而改变的。
定义一个操作的算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
- 多个子类有公有的方法,并且逻辑基本相同
- 重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现
- 重构时,模板方法模式是一个经常使用的模式,把相同的代码抽取到父类中,然后通过钩子函数约束其行为
AbsTemplate
public class AbsTemplate {
public void stepOne() {
System.out.println("步骤一");
}
public void stepTwo() {
System.out.println("步骤二");
}
public void stepThree() {
System.out.println("步骤三");
}
public final void execute() {
stepOne();
stepTwo();
stepThree();
}
}
ConcreateImplA.java
public class ConcreateImplA extends AbsTemplate {
@Override
public void stepOne() {
super.stepOne();
System.out.println("ConcreateImplA 的 步骤一");
}
@Override
public void stepTwo() {
super.stepTwo();
System.out.println("ConcreateImplA 的 步骤二");
}
@Override
public void stepThree() {
super.stepThree();
System.out.println("ConcreateImplA 的 步骤三");
}
}
ConcreateImplB.java
public class ConcreateImplB extends AbsTemplate {
@Override
public void stepOne() {
super.stepOne();
System.out.println("ConcreateImplB 的 步骤一");
}
@Override
public void stepTwo() {
super.stepTwo();
System.out.println("ConcreateImplB 的 步骤二");
}
@Override
public void stepThree() {
super.stepThree();
System.out.println("ConcreateImplB 的 步骤三");
}
}