Java中模板方法模式通过抽象类定义算法骨架,模板方法用final修饰,调用抽象方法和钩子方法;子类实现抽象方法定制步骤,可选重写钩子方法;实现流程统一、扩展安全、复用横切逻辑。

在 Java 中,用抽象类实现模板方法设计模式,核心是:把算法的骨架(即执行流程)定义在抽象类中,而将某些步骤延迟到子类中实现。父类控制流程,子类决定细节,做到“不变的部分统一管理,可变的部分开放定制”。
定义抽象模板类,封装固定流程
抽象类中声明一个 final 的模板方法(如 execute()),它按顺序调用若干抽象或钩子方法。这些被调用的方法可以是:
-
抽象方法:强制子类实现(如
doStep1(),doStep2()) -
钩子方法(hook):有默认空实现的
protected方法(如beforeExecute()),子类可选择性重写
例如:
abstract class DataProcessor {
// 模板方法:不可被重写,定义算法骨架
public final void process() {
beforeExecute();
loadData();
transformData();
saveData();
afterExecute();
}
// 钩子方法:默认不做事,子类可覆盖
protected void beforeExecute() {}
// 抽象方法:子类必须实现
protected abstract void loadData();
protected abstract void transformData();
protected abstract void saveData();
protected void afterExecute() {}
}
子类继承并实现具体逻辑
子类只需关注“怎么做”,不用操心“何时做”。每个抽象方法对应一个具体操作,职责清晰:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
立即学习“Java免费学习笔记(深入)”;
- 避免重复编写流程控制代码
- 新增处理类型时,只写新子类,不修改原有逻辑
- 所有子类共享统一的执行顺序和异常/日志等横切逻辑(可在模板方法中添加)
示例子类:
class CsvProcessor 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("保存为数据库记录");
}
}
运行时调用模板方法,自动触发完整流程
客户端只面向抽象类编程,调用模板方法即可启动整个算法:
DataProcessor processor = new CsvProcessor(); processor.process(); // 输出:before → load → transform → save → after
如果将来增加 JsonProcessor,只要实现三个抽象方法,process() 行为天然符合既有规范,扩展安全且低耦合。
关键设计要点提醒
- 模板方法必须用 final 修饰,防止子类意外覆盖流程
- 抽象方法用 protected,既限制外部调用,又允许子类访问
- 钩子方法不加 abstract,提供默认行为,提升子类实现自由度
- 可在模板方法中加入异常处理、计时、事务等通用逻辑,进一步复用

















