一.定义
定义一个操作中的算法的框架,而将一些步骤延迟到子类中.使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤
二.案例
a.基本设计:
父类{
//需要子类构建细节的方法
protected function1();
protected function2();
//模板方法:子类共有的方法,调用细节方法的汇总(该方法用final防止被重写)
final public void run(){
this.function1();
this.function2();
}
}
子类1 extends 父类{
function1(){...}
function2(){...}
}
子类2 extends 父类{
function1(){...}
function2(){...}
}
client{
父类 a = new 子类1();
a.run();
}
b.稍加拓展
若每个子类的各个方法需要根据不同条件进行处理该如何设计?例如上方的案例不同子类选择性执行function2();
解决: 父类加入"钩子函数"
父类{
//需要子类构建细节的方法
protected function1();
protected function2();
//钩子函数(模板钩子)
protected boolean change(){
return true;
}
//根据条件选择性执行function2();
final public void run(){
this.function1();
if(this.change()){
this.function2();
}
}
}
子类1 extends 父类{
private boolean changeParam = true;
function1(){...}
function2(){...}
protected boolean change(){
return changeParam;
}
public void set changeParam(Boolean param){
this.changeParam = param;
}
}
三.总结:
父类封装通用方法调用部分,将改变的细节交由子类,利用父类引用指向子类对象,调用父类的模板方法即可;注意模板方法并不是父类调用子类,而是子类自己继承调用
子类中:都是一个个方法
父类中:定义各个方法的规则,使用一个方法将子类的方法进行组合执行
而下面的7.建造者模式是将组合执行的过程抽出来单独处理