一 初探
定义一个模板结构,将具体内容延迟到子类去实现。
二 运用场景
一般运用于需要多个步骤完成,且有一些公共(父类实现,子类继承复用)的步骤。对于非公共部分需要子类定制化实现。如jdbc将连接开闭,语句集关闭,结果集关闭作为公共部分,将语句集的实现及结果集获取作为定制化的实现。
模板方法模式定义一个操作中的算法的骨架,将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些步骤。
下面已熬粥为例,上代码:
- 模板类(抽象类)
public abstract class ZhouTemplate {
/**
* 定义final方法,一次执行所有流程,且不能被子类覆盖
*/
final void zhouProcess(){
this.water();
this.pullSource();
this.fire();
}
/**
* step1:加水
*/
public void water(){
System.out.println("公共方法:加入适量的水");
}
/**
* step2:放入原材料
* 大米粥、小米粥、南瓜粥等等原料不一样需要定制化,需要子类实现
*/
public abstract void pullSource();
/**
* step3:加热
*/
public void fire(){
System.out.println("公共方法:持续加热,直至粥熬好");
}
}
- 子类1
public class ZhouDamiConcrete extends ZhouTemplate {
@Override
public void pullSource() {
System.out.println("定制方法:往锅里加入大米");
}
}
- 子类2
public class ZhouXiaomiConcrete extends ZhouTemplate {
@Override
public void pullSource() {
System.out.println("定制方法:往锅里加入小米");
}
}
- 客户端
public static void main(String[] args) {
//反向控制:父类引用子类对象
ZhouTemplate template = new ZhouDamiConcrete();
template.zhouProcess();
}
//结果
公共方法:加入适量的水
定制方法:往锅里加入大米
公共方法:持续加热,直至粥熬好
- 优点
- 提高代码复用性:将相同部分的代码放在抽象的父类中
- 提高了拓展性:将不同的代码放入不同的子类中,通过对子类的扩展增加新的行为
- 实现了反向控制:通过一个父类调用其子类的操作,通过对子类的扩展增加新的行为,实现了反向控制 & 符合“开闭原则”
- 缺点
引入了抽象类,每一个不同的实现都需要一个子类来实现,导致类的个数增加,从而增加了系统实现的复杂度。