模版方法
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 的
JdbcTemplate、RestTemplate、RedisTemplate - Servlet 的
HttpServlet(doGet/doPost就是子类要重写的步骤) - JUnit 的
@BeforeEach→ 测试方法 →@AfterEach - React 类组件的生命周期方法