My App

模版方法

Template Method — 父类定义算法骨架,子类实现具体步骤

一句话理解

在父类中定义一个操作的固定流程(模板),把其中可变的步骤留给子类去实现。

解决什么问题

  • 多个类有相同的处理流程,但某些步骤的实现不同
  • 想把不变的流程固化,只允许子类修改部分步骤
  • 避免子类重复编写相同的流程代码

怎么写

// 抽象父类:定义模板
public abstract class DataProcessor {

    // 模板方法:固定流程,用 final 禁止子类修改
    public final void process() {
        readData();
        processData();
        writeData();
    }

    // 固定步骤
    private void readData() {
        System.out.println("读取数据...");
    }

    // 可变步骤:子类实现
    protected abstract void processData();

    // 可变步骤:子类实现
    protected abstract void writeData();
}

// 子类 1:导出为 JSON
public class JsonExporter extends DataProcessor {
    protected void processData() { System.out.println("转换为 JSON 格式"); }
    protected void writeData()   { System.out.println("写入 .json 文件"); }
}

// 子类 2:导出为 CSV
public class CsvExporter extends DataProcessor {
    protected void processData() { System.out.println("转换为 CSV 格式"); }
    protected void writeData()   { System.out.println("写入 .csv 文件"); }
}
DataProcessor exporter = new JsonExporter();
exporter.process();
// 读取数据...
// 转换为 JSON 格式
// 写入 .json 文件

模板方法 = 父类固定流程 + 子类重写步骤

前端中的模版方法

React 的类组件生命周期就是模版方法思想:

// React 内部定义了生命周期调用顺序(模板)
// 开发者只需要重写需要的步骤
class MyComponent extends React.Component {
  componentDidMount() { /* 挂载后 */ }
  componentDidUpdate() { /* 更新后 */ }
  render() { return <div /> }
}

使用场景

  • Spring 的 JdbcTemplateRestTemplateRedisTemplate
  • Servlet 的 HttpServletdoGet/doPost 就是子类要重写的步骤)
  • JUnit 的 @BeforeEach → 测试方法 → @AfterEach
  • React 类组件的生命周期方法

On this page