定义
定义一个模板结构,将具体内容延迟到子类实现
应用场景
- 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现
- 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复
- 控制子类的扩展。
实例讲解
现在希望学会两道菜:辣椒炒肉、手撕包菜
两道菜的炒菜步骤有重复的,也有差异很大的,记不住,用代码记录下来
第一步:创建抽象模板结构
public abstract class MakeFood {
//申明为final,不希望子类覆盖这个方法,防止更改流程的执行顺序
final void cook(){
this.pourOil();
this.heat();
this.addFood();
this.fry();
}
void pourOil(){
System.out.println("往锅里倒油");
}
void heat(){
System.out.println("加热");
}
abstract void addFood();
void fry(){
System.out.println("翻炒");
}
}
第二步:创建具体模板
public class MakeFoodOne extends MakeFood{
@Override
void addFood() {
System.out.println("加入辣椒和肉");
}
}
public class MakeFoodTwo extends MakeFood{
@Override
void addFood() {
System.out.println("加入包菜");
}
}
客户端调用并查看结果
public class TemplateMethod {
public static void main(String[] args) {
MakeFoodOne makeFoodOne = new MakeFoodOne();
makeFoodOne.cook();
System.out.println("--------------");
MakeFoodTwo makeFoodTwo = new MakeFoodTwo();
makeFoodTwo.cook();
}
}
往锅里倒油
加热
加入辣椒和肉
翻炒
--------------
往锅里倒油
加热
加入包菜
翻炒
优点
①提高代码复用性
将相同部分的代码放在抽象的父类中
②提高了拓展性
将不同的代码放入不同的子类中,通过对子类的扩展增加新的行为
③实现了反向控制
通过一个父类调用其子类的操作,通过对子类的扩展增加新的行为,实现了反向控制 & 符合“开闭原则”
缺点
引入了抽象类,每一个不同的实现都需要一个子类来实现,导致类的个数增加,从而增加了系统实现的复杂度。