该模式将定义一个操作中的算法骨架,并将算法的一些步骤延迟到子类中实现,使得子类可以在不改变算法结构的情况下重定义算法的某些特定步骤。
例如,炒菜的步骤是固定的,具体可分为倒油、热油、倒蔬菜、倒调料品、翻炒等。通过模板方法模式模拟:
java
public abstract class AbstractClass {
public final void cookProcess() {
// 固定的炒菜步骤
this.pourOil();
this.heatOil();
this.pourVegetable();
this.pourSauce();
this.fry();
}
// 倒油、热油、翻炒 是一样的,在抽象类中直接实现
public void pourOil() { System.out.println("倒油"); }
public void heatOil() { System.out.println("热油"); }
public void fry() { System.out.println("翻炒"); }
// 倒蔬菜、倒调料品 取决于蔬菜种类,延迟到子类中实现
public abstract void pourVegetable();
public abstract void pourSauce();
}
public class ConcreteClassOfTomato extends AbstractClass {
@Override
public void pourVegetable() {
System.out.println("下锅的蔬菜是西红柿");
}
@Override
public void pourSauce() {
System.out.println("下锅的酱料是盐");
}
}
优点
-
提高代码复用
-
实现了反向控制,由父类决定整体流程,子类仅提供局部细节的实现,遵守 OCP 开闭原则
缺点
-
每当新增一个不同的实现时,都需要定义一个新的子类,导致类个数增加,系统复杂度增加
-
反向控制增加了代码阅读的难度