模板方法是最实用的模式之一:父类定义流程骨架,子类填空具体步骤。Spring 的 JdbcTemplate、RestTemplate 就是它的落地。这篇讲清它怎么"定骨架、留钩子"。
一、解决什么问题:流程固定,步骤不同
很多操作流程是固定的,但其中某几步不同。比如"处理数据"都是"读数据 → 处理 → 写结果"三步,但"怎么处理"因场景而异。
不用模板方法,每个场景都要写一遍三步流程(重复)。模板方法:父类把三步流程定死,只把"处理"这步留给子类。
二、核心结构
java
abstract class DataProcessor {
// 模板方法:final,定死骨架,不让子类改
public final void process() {
readData(); // ① 固定步骤
processData(); // ② 留给子类填空
writeData(); // ③ 固定步骤
}
private void readData() { System.out.println("读数据"); }
private void writeData() { System.out.println("写结果"); }
protected abstract void processData(); // 抽象方法:子类实现
}
// 子类:只填空"处理"这一步
class JsonProcessor extends DataProcessor {
protected void processData() { System.out.println("处理 JSON"); }
}
class XmlProcessor extends DataProcessor {
protected void processData() { System.out.println("处理 XML"); }
}
// 使用:骨架是父类定好的,子类只补差异
new JsonProcessor().process();关键:process() 是 final 的模板方法,流程定死;processData() 是抽象方法,留给子类。这就是"定骨架、留钩子"。
三、核心价值
- 复用:流程只写一遍,子类只补差异
- 控制:父类
final方法控制流程,防止子类破坏骨架 - 好莱坞原则:"别调用我,我会调用你"——父类调用子类方法,而不是子类调用父类
四、实际应用
JdbcTemplate:execute()定好"获取连接 → 执行 → 释放连接"的骨架,你只填空 SQL 和结果处理RestTemplate:定好"发请求 → 处理响应"的骨架,你填空 URL 和参数- Servlet:
HttpServlet的doGet/doPost,容器调用它们
小结
- 模板方法:父类定流程骨架,子类填空具体步骤
- 骨架用
final方法定死,差异用抽象方法留给子类 - 典型:JdbcTemplate、RestTemplate、Servlet
相关:《策略模式》(模板方法用"继承"填空,策略用"组合"换算法,两者常被对比)。
