第8章:模板方法模式(Template Method Pattern)
一、导读
1.1 本章学习目标
第8章讲解模板方法模式——在父类中定义算法骨架,子类实现具体步骤。
1.2 为什么第八章如此重要
模板方法模式是继承复用的经典应用,通过"好莱坞原则"实现控制反转。
1.3 核心问题引导
模板方法模式的结构是什么?
钩子方法的作用是什么?
好莱坞原则是什么?
模板方法和策略模式有什么区别?
二、核心概念详解
8.1 模板方法
java
public abstract class Beverage {
// 模板方法:定义算法骨架
final void prepareRecipe() {
boilWater();
brew();
pourInCup();
addCondiments();
}
abstract void brew();
abstract void addCondiments();
void boilWater() { System.out.println("Boiling water"); }
void pourInCup() { System.out.println("Pouring into cup"); }
}
public class Tea extends Beverage {
void brew() { System.out.println("Steeping the tea"); }
void addCondiments() { System.out.println("Adding lemon"); }
}
public class Coffee extends Beverage {
void brew() { System.out.println("Dripping coffee through filter"); }
void addCondiments() { System.out.println("Adding sugar and milk"); }
}8.2 钩子方法
java
public abstract class Beverage {
final void prepareRecipe() {
boilWater();
brew();
pourInCup();
if (customerWantsCondiments()) { // 钩子
addCondiments();
}
}
// 钩子:子类可以选择性覆盖
boolean customerWantsCondiments() { return true; }
abstract void brew();
abstract void addCondiments();
void boilWater() { }
void pourInCup() { }
}8.3 好莱坞原则
好莱坞原则:
"不要打电话给我们,我们会打电话给你"
在模板方法中:
- 父类控制流程
- 子类只负责实现具体步骤
- 子类不需要主动调用父类三、实战案例
8.1 排序中的模板方法
java
// Java 的 Arrays.sort 使用模板方法
// 算法骨架在 sort 方法中
// 比较逻辑由 compareTo 提供
public class Duck implements Comparable<Duck> {
String name;
int weight;
public int compareTo(Duck other) {
return Integer.compare(this.weight, other.weight);
}
}
Duck[] ducks = { /* ... */ };
Arrays.sort(ducks); // 使用 Duck 的 compareTo四、本章小结
模板方法在父类中定义算法骨架,子类实现具体步骤。钩子方法提供可选的扩展点。好莱坞原则实现控制反转。
五、思考与练习
模板方法如何体现控制反转?
钩子方法有什么用途?
模板方法和策略模式如何选择?
为什么模板方法通常是 final 的?
模板方法在框架中如何应用?