模板方法模式通过抽象类定义算法骨架,子类实现抽象方法、选择性覆盖钩子方法,模板方法用final确保流程不可变。

在抽象类中实现模板方法设计模式,核心是:把算法的骨架(固定流程)定义在抽象类中,而将某些步骤延迟到子类中实现。父类控制执行顺序,子类决定具体行为。
定义抽象模板类,声明模板方法和抽象/钩子方法
模板方法本身用 final 修饰(防止被重写),内部按逻辑顺序调用若干方法。其中:
- 抽象方法(abstract):必须由子类实现,代表算法中变化的部分;
- 钩子方法(protected 空实现或默认实现):子类可选择性覆盖,用于扩展点;
- 具体方法(private / protected / public):父类已实现,供模板方法直接调用。
示例:
abstract class DataProcessor {
// 模板方法:定义算法骨架,不允许子类修改流程
public final void process() {
loadData();
validateData();
transformData();
saveData();
afterProcess(); // 钩子方法,可选扩展
}
// 抽象方法:子类必须实现
protected abstract void loadData();
protected abstract void transformData();
protected abstract void saveData();
// 具体方法:父类提供通用逻辑
protected void validateData() {
System.out.println("默认校验数据格式...");
}
// 钩子方法:有默认空实现,子类可选择覆盖
protected void afterProcess() {
// 默认不执行任何操作
}
}
子类继承并实现抽象方法
子类只需关注“做什么”,不用关心“什么时候做”。只要实现所有 abstract 方法,就能复用父类定义的完整流程。
class CsvDataProcessor extends DataProcessor {
@Override
protected void loadData() {
System.out.println("从 CSV 文件加载数据");
}
@Override
protected void transformData() {
System.out.println("将 CSV 数据转为对象列表");
}
@Override
protected void saveData() {
System.out.println("保存到内存缓存");
}
// 可选:覆盖钩子方法
@Override
protected void afterProcess() {
System.out.println("发送处理完成通知");
}
}
使用方式简洁直观
客户端代码只面向抽象类编程,调用模板方法即可触发整套流程:
DataProcessor processor = new CsvDataProcessor(); processor.process(); // 输出完整流程,顺序固定
输出结果:
从 CSV 文件加载数据 默认校验数据格式... 将 CSV 数据转为对象列表 保存到内存缓存 发送处理完成通知
关键设计要点
- 模板方法必须是 final,确保算法骨架不被破坏;
- 抽象方法用 protected,既允许子类访问,又避免外部调用;
- 钩子方法不要加 abstract,否则子类强制实现,失去“可选”意义;
- 若某步逻辑在多数子类中相同,可提升为具体方法;若差异大,才设为抽象或钩子。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











