模板设计模式用抽象类定义算法骨架,模板方法用final修饰确保流程不可变,抽象方法强制子类实现差异步骤,钩子方法提供可选扩展;子类仅需实现抽象方法,专注具体逻辑。

Java 模板设计模式用抽象类实现,核心是把算法骨架定义在抽象类中,把可变步骤延迟到子类实现。抽象类负责控制流程,子类只专注具体逻辑,既复用结构又保持灵活性。
抽象类定义模板方法和钩子方法
抽象类中用 final 修饰模板方法(如 execute()),确保子类不能重写执行顺序;用 abstract 声明必须由子类实现的步骤(如 doStep1(), doStep2());也可提供默认空实现的钩子方法(如 beforeExecute()),供子类选择性覆盖。
- 模板方法内部按固定顺序调用抽象/钩子/具体方法
- 抽象方法强制子类实现关键差异点
- 钩子方法不加 abstract,子类可重写也可忽略
子类继承并实现抽象步骤
子类只需继承抽象类,重写所有 abstract 方法,无需关心整体流程。例如处理订单的场景:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 抽象类定义
processOrder():校验 → 扣库存 → 创建订单 → 发通知 - 子类
OnlineOrder实现扣库存为远程调用,OfflineOrder实现为本地数据库更新 - 发通知步骤可设为钩子,默认发短信,
PremiumOrder子类重写为同时发邮件+站内信
注意访问权限与扩展边界
抽象类中的模板方法通常设为 public,抽象方法为 protected(避免外部直接调用),具体辅助方法可用 private 封装细节。不要让子类随意改变模板方法逻辑——这是模板模式的底线。
- 禁止子类重写模板方法(用 final 保证)
- 避免在抽象类中暴露过多可重写方法,防止流程被意外破坏
- 若需运行时切换行为,可结合策略模式,而非强行在模板中增加分支
一个极简示例
以下代码展示核心结构:
abstract class DataProcessor {
// 模板方法:不可重写
public final void process() {
loadData();
validate();
transform();
save();
afterProcess(); // 钩子方法
}
// 具体方法:父类已实现
private void loadData() { System.out.println("加载数据"); }
// 抽象方法:子类必须实现
protected abstract void validate();
protected abstract void transform();
protected abstract void save();
// 钩子方法:默认空实现,子类可选覆盖
protected void afterProcess() {}
}
class CsvProcessor extends DataProcessor {
protected void validate() { System.out.println("校验 CSV 格式"); }
protected void transform() { System.out.println("转成对象列表"); }
protected void save() { System.out.println("存入数据库"); }
}
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










