抽象类通过final模板方法锁定统一流程,将可变步骤声明为abstract强制子类实现,封装公共逻辑减少重复,并用hook钩子提供可选扩展点。

用 abstract 抽象类定义通用模板方法,核心是把不变的流程控制权收在父类,把可变的业务细节交给子类去填。关键不在于“写得多”,而在于“分得清”——哪些必须统一执行,哪些允许各自发挥。
明确算法骨架,用 final 锁定主干流程
在抽象类中声明一个 public final void 模板方法(),里面按顺序调用若干步骤。这个方法不能被子类重写,确保所有子类都走同一套流程。比如:
- 准备资源(统一初始化)
- 执行核心操作(留给子类实现)
- 收尾处理(统一日志、释放、校验)
把差异点声明为 abstract 方法,强制子类覆盖
模板方法里调用的、但父类无法确定具体逻辑的步骤,全部定义为 protected abstract void xxx()。子类继承时,编译器会强制你实现这些方法,否则无法实例化。例如泡咖啡和煮茶共用“烧水→冲泡→倒杯→加料”流程,只有“冲泡”和“加料”是 abstract 的。
封装公共逻辑,减少子类重复代码
那些所有子类都会用到的辅助行为(如记录开始时间、格式化输出、参数校验),直接在抽象类里用 private 或 protected final 方法写好,模板方法里直接调用。子类看不到也不需要改,自然复用。
必要时加入 hook 钩子方法,提供可选扩展点
有些步骤多数子类不需要干预,但个别场景想定制,就定义 protected void onXXX() { } 这样的空实现钩子方法。子类按需重写,不影响其他子类。比如模板里调用 onBeforeExecute(),默认什么也不做,A子类可以加埋点,B子类可以跳过。

















