在开发中,如果遇到某个方法的实现需要调用多个方法,这些方法有些是固定不变的,有些是发生变化的,就可以采用模板方法模式。将每个步骤对应的方法作为基本方法,而调用这些方法同时定义步骤顺序的方法称为模板方法。
模板方法模式的定义:定义一个操作中算法的框架,而将一些步骤延迟到子类中。模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
基本方法也叫做基本操作,是由子类实现的方法,并且在模板方法被调用。
模板方法可以有一个或几个,一般是一个具体方法,也就是一个框架,实现对基本方法的调度,完成固定的逻辑。
举例如下:
// 模板父类实现模板方法
public abstract class Model {
protected abstract void step1();
protected abstract void step2();
protected abstract void step3();
final public void process(){
this.step1();
this.step2();
this.setp3();
}
}
// 子类实现自己的基础方法
public class Child extends Model {
protected void step1(){
// TODO
}
protected void step2(){
// TODO
}
protected void step3(){
// TODO
}
}
// 测试类
public class Test {
public static void main(String[] args){
Model m = new Child();
m.process();
}
}
另外,在扩展中还可以加上钩子方法,由子类来控制模板方法中某方法的执行与否等,比如:
// 模板父类实现模板方法
public abstract class Model {
protected abstract void step1();
protected abstract void step2();
protected abstract void step3();
final public void process(){
this.step1();
// 这里加入step2方法执行的判断
if(isStep2Need()){
this.step2();
}
this.setp3();
}
// 是否需要step2方法执行
protected boolean isStep2Need(){
return true;
}
}
然后,修改子类为:
// 子类实现自己的基础方法
public class Child extends Model {
private boolean flag = true;
protected void step1(){
// TODO
}
protected void step2(){
// TODO
}
protected void step3(){
// TODO
}
protected boolean isStep2Need(){
return this.flag;
}
public void setFlag(boolean flag){
this.flag = flag;
}
}
这样在测试类中,可以控制模板方法中方法的执行与否:
// 测试类
public class Test {
public static void main(String[] args){
Model m = new Child();
m.setFlag(false);
m.process();
}
}
有了钩子方法,可以对模板方法中的基本方法的执行顺序进行变更。