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();
}
}运行结果:
把水煮沸
用热水泡咖啡
把饮料倒进杯子
在咖啡中加入适当的牛奶和糖
------------------
把水煮沸
用热水泡茶
把饮料倒进杯子
本文介绍了模板方法设计模式的基本概念,通过冲泡咖啡与茶的例子详细展示了如何在不改变算法结构的情况下,允许子类重新定义算法中的某些步骤。文中还提供了具体的Java实现代码。

被折叠的 条评论
为什么被折叠?



