- 定义:
定义一个操作中的算法的骨架,而将步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义算法的某些特定步骤。 -
UML:
-
模型:泡茶与泡咖啡。
泡茶的算法骨架:水烧开-冲泡茶叶-把茶水倒入杯子-加柠檬
泡咖啡的算法骨架:水烧开-冲泡咖啡粉-把咖啡倒入杯子-加糖和牛奶
我们抽象出制作热饮的步骤:
public abstract class HotDrink {
//步骤是固定的,所以用final修饰,不允许改变
public final void prepareRecipe(){
boilWater();
brew();
pourInCup();
addCondiments();
}
//这一步是固定的,所以用final修饰,不允许改变
public final void boilWater() {
System.out.println("烧水");
}
private final void pourInCup() {
System.out.println("倒进杯子中");
}
protected abstract void brew();
protected abstract void addCondiments();
}
//咖啡对象
public class Coffee extends HotDrink {
@Override
protected void brew() {
System.out.println("冲泡咖啡");
}
@Override
protected void addCondiments() {
System.out.println("添加糖和牛奶");
}
}
//茶对象
public class Tea extends HotDrink {
@Override
protected void brew() {
System.out.println("冲泡茶叶");
}
@Override
protected void addCondiments() {
System.out.println("添加柠檬");
}
}
使用方式:
public class MainTest {
public static void main(String[] agrs){
HotDrink coffee = new Coffee();
HotDrink tea = new Tea();
coffee.prepareRecipe();
tea.prepareRecipe();
}
}
运行结果:
通过抽象出模板模式,子类复用了超类中固定的部分,不同的子类中只需定义算法细节,就能实现不同的扩展,例如我们如果想加一种奶茶的热饮,只需要继承HotDrink,再实现冲泡奶茶,加珍珠这两步即可。