java抽象类通过模板方法模式固化执行流程:final模板方法锁死顺序,子类实现抽象方法、复用具体方法、按需重写钩子方法;构造器统一校验与初始化;protected成员支持上下文传递;钩子方法预留弹性扩展点。

Java 抽象类通过模板方法模式为子类提供统一的执行流程,核心是把“不变的顺序”锁死在父类,把“可变的实现”交给子类填空。
用 final 模板方法固化流程骨架
模板方法本身必须是 public final void,确保子类无法覆盖或打乱步骤顺序。它内部按固定次序调用多个受保护的方法:
- 抽象方法(protected abstract):子类必须实现,比如
brew()、validate() - 具体方法(protected 或 private):父类已写好通用逻辑,如
boilWater()、logStart() - 钩子方法(protected + 空实现):默认不做事,子类按需重写,如
shouldRetry()、beforeSave()
用构造器统一初始化基础状态
抽象类虽不能实例化,但其构造器会在子类创建对象时自动执行,适合做全局校验和共享字段赋值:
- 对必填参数做非空、范围等校验,失败直接抛异常
- 将关键字段声明为 final,并在构造器中一次性初始化,防止子类绕过或误改
- 初始化共用依赖,如日志器(
LoggerFactory.getLogger(getClass()))、配置对象、线程池等
用 protected 成员支撑变量流与上下文传递
避免子类各自 new 上下文对象,抽象类可定义标准容器并封装安全存取逻辑:
- 提供泛型安全的
context.set("key", value)和context.get("key", String.class) - 在模板方法关键节点自动注入公共变量(如
tenantId、traceId) - 所有子类只负责往容器里塞业务变量,不关心线程隔离、序列化或跨阶段透传机制
靠钩子方法预留弹性扩展点
不是所有任务都需要额外处理,但一旦需要,就必须发生在确定位置:
- 钩子方法命名体现时机,如
afterLoadData()、beforeSubmitExternal() - 默认为空实现,子类覆盖时不改变主流程,也不影响其他子类
- 适合做轻量增强:补字段、发通知、触发埋点、条件性调用下游系统
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











