目录
一、模板方法的定义
一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。
二、类图
三、例子
1、冲咖啡
public class Coffee {
void prepareRecipe() {
boilWater();
brewCoffeeGrinds();
addSugarAndMilk();
}
public void boilWater() {
System.out.println("烧水...");
}
public void brewCoffeeGrinds() {
System.out.println("冲咖啡");
}
public void addSugarAndMilk() {
System.out.println("加糖和奶");
}
}
2、泡茶
public class Tea {
void prepareRecipe() {
boilWater();
steepTeaBag();
addLemon();
}
public void boilWater() {
System.out.println("烧水...");
}
public void steepTeaBag() {
System.out.println("冲泡茶叶");
}
public void addLemon() {
System.out.println("加柠檬");
}
}
观察这两个类泡茶和冲咖啡,有共同的代码(重复的代码:烧水的动作),可以抽取出来,构建一个抽象类。
3、抽象类
public abstract class CaffeineBeverage {
final void prepareRecipe(){
boilWater();
brew();
addCondiments();
}
void boilWater(){
System.out.println("烧水");
}
abstract void brew();
abstract void addCondiments();
}
4、修改后的冲咖啡
public class Coffee extends CaffeineBeverage{
@Override
void brew() {
System.out.println("冲咖啡");
}
@Override
void addCondiments() {
System.out.println("加糖和奶");
}
}
5、泡茶
public class Tea extends CaffeineBeverage {
@Override
void brew() {
System.out.println("冲泡茶叶");
}
@Override
void addCondiments() {
System.out.println("加柠檬");
}
}
思考:
1、好莱坞原则:高层组件控制何时以及如何让低层组件参与,低层组件不可以直接调用高层组件
2、工厂方法、策略模式、模板方法区别
工厂方法:由子类决定实例化哪个具体类
模板方法:子类决定如何实现算法中的步骤
策略模式:封装可互换的行为,然后使用委托来决定要采用哪一个行为