Java中骨架实现类模式通过抽象类定义算法骨架,模板方法用final修饰封装固定流程,调用abstract方法强制子类实现核心步骤,钩子方法提供可选扩展。

Java 中通过抽象类实现骨架实现类模式(Template Method Pattern),核心是把算法的骨架定义在抽象类中,将可变步骤延迟到子类实现。
抽象类定义模板方法
在抽象类中,用 final 修饰的模板方法封装固定流程,调用若干抽象或钩子方法。这些被调用的方法由子类具体实现,但调用顺序和逻辑结构由父类控制。
- 模板方法必须声明为 final,防止子类重写破坏流程
- 关键步骤声明为 abstract,强制子类提供实现
- 可选步骤可用空实现或默认实现(称为“钩子方法”),子类按需覆盖
子类继承并实现抽象方法
子类只需关注自己负责的业务逻辑部分,无需关心整体执行顺序。只要实现所有 abstract 方法,就能获得完整可用的功能。
- 不重写模板方法,避免流程错乱
- 可选择性覆盖钩子方法(如
isDebugEnabled()、afterProcess())来微调行为 - 保持与父类的契约:输入输出一致、异常处理策略协调
一个典型例子:文件处理器
假设统一处理各类文本文件,步骤固定为「打开→读取→解析→保存→关闭」,其中「解析」逻辑因格式而异。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
立即学习“Java免费学习笔记(深入)”;
abstract class FileProcessor {
// 模板方法(不可重写)
public final void process(String path) {
open(path);
String content = read();
Object result = parse(content); // 抽象方法,子类实现
save(result);
close();
}
<pre class="brush:php;toolbar:false;">protected abstract Object parse(String content);
protected void open(String path) { /* 默认实现 */ }
protected String read() { /* 默认实现 */ }
protected void save(Object data) { /* 默认实现 */ }
protected void close() { /* 默认实现 */ }}
class JsonFileProcessor extends FileProcessor { @Override protected Object parse(String content) { return new Gson().fromJson(content, Map.class); } }
注意事项与设计要点
骨架实现的关键不在语法,而在职责划分是否清晰。容易出问题的地方包括:
- 抽象类中避免在构造器里调用 abstract 方法(可能导致子类字段未初始化)
- 模板方法内尽量不暴露内部状态,减少子类对父类实现的依赖
- 若算法步骤较多且存在条件分支,可将分支逻辑也提取为钩子方法,提升可扩展性
- 必要时配合 protected 工具方法,供子类复用,而非重复造轮子
这种模式让框架代码稳定,业务代码灵活,是抽象类最经典、最实用的用途之一。

















