模板方法模式通过final模板方法固化执行顺序,将不变流程锁死在抽象父类,可变细节由protected abstract方法强制子类实现,并用protected钩子方法支持条件定制。

模板方法模式规范化定义核心业务骨干流程,关键在于把“不变的顺序”锁死在抽象父类里,把“可变的细节”明确交给子类去实现。不是简单抽个方法,而是让流程控制权始终在父类手上。
用 final 模板方法固化执行骨架
模板方法本身必须是 public final,不可被子类覆盖。它内部按严格顺序调用所有步骤,比如:
- checkParam() —— 固定校验逻辑
- doBusiness() —— 抽象方法,子类强制实现
- notify() —— 固定回调处理
- log() —— 固定日志记录
这个顺序一旦写进 final void execute(),子类就无法跳过、颠倒或重复某步。
用 protected abstract 明确可变边界
哪些环节允许差异化?必须通过 protected abstract 方法显式声明,例如:
protected abstract void doPay(String orderId);protected abstract Result parseResponse(byte[] data);
这样既保证子类必须提供实现,又限制其作用域仅限于继承链内,不对外暴露。不能用 public 或 private,前者破坏封装,后者子类根本访问不到。
用钩子方法支持条件分支与轻量定制
对非强制但可能调整的行为,定义带默认空实现的 protected 钩子方法,例如:
protected boolean shouldRetry() { return false; }protected void onTimeout() { /* 默认不处理 */ }
子类按需重写,不影响主干流程。它比抽象方法更灵活,又比直接修改模板方法更安全。
避免常见失范操作
以下做法会破坏模板方法的本质:
- 把模板方法设为 abstract,导致每个子类都要重写调用顺序
- 在模板方法中调用子类可能未初始化的 this 方法
- 用接口替代抽象类——接口无法强制子类实现方法,也无法控制字段和构造顺序
- 把整个流程逻辑放在子类里,父类只剩一个空壳方法
真正的骨干流程,是父类写清楚“先做什么、再做什么、最后做什么”,子类只填空“怎么做”。不复杂但容易忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











