模板方法模式通过抽象类定义算法骨架,将可变步骤延迟到子类实现,确保算法结构不变。抽象类含final模板方法、abstract抽象方法和可选hook钩子方法,子类仅需实现抽象方法即可复用完整流程。

模板方法模式通过抽象类定义算法骨架,把某些步骤延迟到子类中实现,让子类在不改变算法结构的前提下重新定义该算法的某些特定步骤。
抽象类定义模板方法和钩子操作
抽象类中声明一个 final 的模板方法,它按固定顺序调用若干抽象或具体方法。其中抽象方法由子类实现,具体方法可被直接复用,还可提供空实现的钩子方法(hook),供子类选择性重写。
- 模板方法必须用 final 修饰,防止子类篡改执行流程
- 抽象方法用 abstract 声明,强制子类实现核心逻辑
- 钩子方法是普通方法,默认空实现,子类可覆盖但不强制
子类继承并实现抽象步骤
子类继承抽象类后,只需实现所有抽象方法,即可获得完整可用的算法。不需要关心调用顺序或整体流程,专注自身业务逻辑。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 子类不能重写模板方法(因 final),但可重写钩子方法来微调行为
- 子类可调用父类已实现的具体方法,避免重复编码
- 若某步骤逻辑完全通用,可在抽象类中直接实现,子类自动继承
典型代码结构示例
比如定义一个“制作饮品”流程:
抽象类(模板定义):abstract class Beverage {
// 模板方法:final,不可重写
final void prepareRecipe() {
boilWater(); // 具体方法
brew(); // 抽象方法 → 子类实现
pourInCup(); // 具体方法
addCondiments(); // 钩子方法 → 可选覆盖
}
abstract void brew();
abstract void addCondiments();
void boilWater() { System.out.println("烧开水"); }
void pourInCup() { System.out.println("倒入杯中"); }
// 默认不加调料,子类可选择覆盖
void addCondiments() {}
}
子类(定制实现):class Coffee extends Beverage {
void brew() { System.out.println("冲泡咖啡粉"); }
void addCondiments() { System.out.println("加糖和牛奶"); }
}
class Tea extends Beverage {
void brew() { System.out.println("浸泡茶叶"); }
// 不覆盖 addCondiments → 默认不加调料
}
关键设计要点
使用时需注意几个边界问题:
- 抽象类不是为了被实例化,而是作为模板载体,应明确标注为 abstract
- 模板方法内应只调用本类可见的方法(private 方法无法被子类扩展,慎用)
- 钩子方法命名建议带 hook 或以 do/on 开头(如
onBeforeStep()),增强语义 - 若算法步骤间有依赖或条件分支,可在模板方法中用 if/else 控制,保持结构稳定
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










