Skip to content

模板方法是最实用的模式之一:父类定义流程骨架,子类填空具体步骤。Spring 的 JdbcTemplateRestTemplate 就是它的落地。这篇讲清它怎么"定骨架、留钩子"。

一、解决什么问题:流程固定,步骤不同

很多操作流程是固定的,但其中某几步不同。比如"处理数据"都是"读数据 → 处理 → 写结果"三步,但"怎么处理"因场景而异。

不用模板方法,每个场景都要写一遍三步流程(重复)。模板方法:父类把三步流程定死,只把"处理"这步留给子类

二、核心结构

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 方法控制流程,防止子类破坏骨架
  • 好莱坞原则:"别调用我,我会调用你"——父类调用子类方法,而不是子类调用父类

四、实际应用

  • JdbcTemplateexecute() 定好"获取连接 → 执行 → 释放连接"的骨架,你只填空 SQL 和结果处理
  • RestTemplate:定好"发请求 → 处理响应"的骨架,你填空 URL 和参数
  • ServletHttpServletdoGet/doPost,容器调用它们

小结

  • 模板方法:父类定流程骨架,子类填空具体步骤
  • 骨架用 final 方法定死,差异用抽象方法留给子类
  • 典型:JdbcTemplate、RestTemplate、Servlet

相关:《策略模式》(模板方法用"继承"填空,策略用"组合"换算法,两者常被对比)。