模板方法模式通过抽象类定义算法骨架,将可变步骤声明为抽象或钩子方法供子类实现。核心是public final模板方法封装固定流程,子类仅需实现protected abstract方法,不可重写模板方法。

Java 中用抽象类定义核心算法骨架、让子类实现具体步骤,靠的是 模板方法模式(Template Method Pattern)。核心思路是:在抽象类中声明一个 final 的模板方法,封装不变的执行流程;把可变的步骤声明为 抽象方法或钩子方法,交由子类覆盖实现。
定义抽象模板类:封装流程,留出扩展点
抽象类负责定义算法的总体结构(比如“煮咖啡”包含烧水、冲泡、倒入杯、加调料),其中固定顺序不能改,但每步怎么做由子类决定。
- 用 public final void 模板方法() 写主逻辑,调用若干受保护的方法
- 将必须定制的步骤声明为 protected abstract 方法(如
brew()、addCondiments()) - 可选地提供 protected 默认空实现的钩子方法(如
hook()),子类按需重写
子类继承并实现抽象步骤
子类只需关注自己负责的那几步,不改变整体流程,也不误调用顺序。
- 必须实现所有 abstract 方法
- 可选择性重写钩子方法,控制是否执行某分支逻辑
- 不能重写模板方法本身(因它被声明为 final)
一个典型例子:制作热饮
抽象类 Beverage 定义冲泡流程:
立即学习“Java免费学习笔记(深入)”;
abstract class Beverage {
// 模板方法:final,不可重写
final void prepareRecipe() {
boilWater();
brew(); // 抽象步骤
pourInCup();
addCondiments(); // 抽象步骤
}
void boilWater() { System.out.println("烧开水"); }
void pourInCup() { System.out.println("倒入杯子"); }
protected abstract void brew();
protected abstract void addCondiments();
}
子类只需填空:
class Coffee extends Beverage {
protected void brew() { System.out.println("用沸水冲泡咖啡粉"); }
protected void addCondiments() { System.out.println("加糖和牛奶"); }
}
class Tea extends Beverage {
protected void brew() { System.out.println("用沸水浸泡茶叶"); }
protected void addCondiments() { System.out.println("加柠檬片"); }
}
调用 new Coffee().prepareRecipe() 就自动走完整流程,且各步骤行为由子类精准控制。
关键细节提醒
- 模板方法通常设为 public final,防止子类破坏流程
- 抽象步骤用 protected abstract,既限制外部访问,又强制子类实现
- 若某步骤可选,用 protected 非抽象方法 + 空默认实现,比抽象更灵活
- 避免在抽象类构造器中调用抽象方法——子类对象尚未初始化完成,可能引发 NPE 或未定义行为


















