1. 模板方法模式:解决重复代码的利器
每次看到项目中那些结构相似却又略有不同的代码块,我都忍不住想找个锤子把它们砸碎重构。上周review同事的订单处理模块时,发现支付校验、库存扣减、日志记录这些流程在各个子类中重复出现,只是具体实现细节稍有差异——这不正是模板方法模式的典型应用场景吗?
模板方法模式属于行为型设计模式,它通过定义一个算法的骨架,而将一些步骤延迟到子类中实现。就像做蛋糕的模具,模具本身决定了蛋糕的形状(固定流程),但你可以自由选择放入巧克力还是草莓(可变实现)。在Java中,我们通常用抽象类来实现这种模式,其中包含两类方法:模板方法(定义流程的final方法)和抽象方法(子类必须实现的步骤)。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 模式结构与核心组件
2.1 标准UML类图解析
code复制AbstractClass
├── templateMethod() [final]
├── primitiveOperation1() [abstract]
├── primitiveOperation2() [abstract]
└── hook() [可选钩子方法]
ConcreteClassA extends AbstractClass
├── primitiveOperation1()
└── primitiveOperation2()
ConcreteClassB extends AbstractClass
├── primitiveOperation1()
└── primitiveOperation2()
2.2 关键角色说明
-
抽象模板(AbstractClass):定义算法骨架,包含:
- 模板方法:用final修饰防止子类重写,定义算法步骤顺序
- 基本方法:抽象方法(必须实现)或钩子方法(可选覆盖)
-
具体实现(ConcreteClass):实现父类定义的抽象方法,完成特定步骤
重要原则:好莱坞原则("Don't call us, we'll call you")——子类不调用父类,而是父类调用子类
3. 实战:订单处理系统改造
3.1 原始代码问题分析
改造前订单处理类结构:
java复制class AliPayOrder {
void process(
