1.定义:模板方法设计模式------在一个方法中定义一个
算法的骨架,而将一些步骤
延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
2.引申知识点:骨架方法定义为 final,目的是防止子类去修改它。算法步骤可以动态改变,使用的是 钩子函数,子类决定是否执行。
2.引申知识点:骨架方法定义为 final,目的是防止子类去修改它。算法步骤可以动态改变,使用的是 钩子函数,子类决定是否执行。
3. head first 中的例子
1 | 冲泡咖啡 | 冲泡茶 | 抽象公共部分 |
2 | 把水煮沸 | 把水煮沸 | 把水煮沸 |
3 | 用沸水冲泡咖啡 | 用沸水冲泡茶叶 | 用热水泡咖啡或茶 |
4 | 把咖啡倒进杯子 | 把茶倒进杯子 | 把饮料倒进杯子 |
5 | 加糖和牛奶 | 加柠檬 | 在饮料中加入适当的调料 |
4.代码部分
public abstract class CoffeineBeverage {// 咖啡因饮料
final void prepareRecipe() { // 准备 食谱
boilWater(); // 把水煮沸
brew(); // 用热水泡咖啡或茶
pourInCup(); // 把饮料倒进杯子
if (customerWantsCondiments()) {
addCondiments();// 在饮料中加入适当的调料
}
}
abstract void brew();
abstract void addCondiments();
private void boilWater() {
System.out.println("把水煮沸");
}
private void pourInCup() {
System.out.println("把饮料倒进杯子");
}
// 钩子函数,子类可以进行修改,用于骨架的构建
public boolean customerWantsCondiments() {
return true;
}
}
public class CoffieWithHook extends CoffeineBeverage {
@Override
void brew() {
System.out.println("用热水泡咖啡");
}
@Override
void addCondiments() {
System.out.println("在咖啡中加入适当的牛奶和糖");
}
}
public class TeaWithHook extends CoffeineBeverage {
@Override
void brew() {
System.out.println("用热水泡茶");
}
@Override
void addCondiments() {
System.out.println("在茶中加入适当的柠檬");
}
public boolean customerWantsCondiments() {
return false;
}
}
public class Client {
public static void main(String[] args) {
CoffieWithHook ch = new CoffieWithHook();
ch.prepareRecipe();
System.out.println("------------------");
TeaWithHook th = new TeaWithHook();
th.prepareRecipe();
}
}
运行结果:
把水煮沸
用热水泡咖啡
把饮料倒进杯子
在咖啡中加入适当的牛奶和糖
------------------
把水煮沸
用热水泡茶
把饮料倒进杯子