模板方法实际上时封装一个固定流程,就像执行一套执行模板一样,第一步该做什么,第二步该做什么,都已经在抽象类中定义好。而子类可以有不同的算法实现,在框架不被修改的情况下实现某种特定步骤的算法。
在重构时,模板方法就是一个经常使用的模式,把相同的代码抽取到父类中,然后通过钩子函数约束其行为。
public abstract class AbstractTemplate {
public void stepA() {};
public void stepB() {};
public final doSth() {
stepA();
stepB();
}
// doSth为final方法,这样就可以保证逻辑流程不会被子类修改
// 子类只能够改变某一个步骤的具体实现,这样就保证的整个流程的稳定性
}
public class Template extends AbstractTemplate {
@override
public void stepA() { /* do A */ };
@override
public void stepB() { /* do B */ };
// 将函数的实现延迟到子类
}
// 调用
new Template().doSth();
综合代码段来看,实际上就是把一个固定的流程封装到一个final函数中,并且让子类能够定制这个流程中的某些步骤。