1. 模板方法模式概述
模板方法模式是一种行为设计模式,它定义了一个操作中的算法骨架,而将一些步骤延迟到子类中实现。这种模式允许子类在不改变算法结构的情况下重新定义算法的某些特定步骤。
我第一次在实际项目中应用模板方法模式是在开发一个电商平台的订单处理系统时。当时系统需要支持多种支付方式(支付宝、微信、银联等),每种支付方式的处理流程大体相同,但某些具体步骤又存在差异。这正是模板方法模式的典型应用场景。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 模式结构与核心组件
2.1 类结构图解
模板方法模式主要包含两个角色:
-
抽象类(AbstractClass):
- 定义算法骨架(模板方法)
- 声明抽象方法(由子类实现)
- 提供钩子方法(可选步骤)
-
具体子类(ConcreteClass):
- 实现抽象类中定义的抽象方法
- 可选择性地覆盖钩子方法
2.2 代码示例
java复制// 抽象类
public abstract class OrderProcessor {
// 模板方法(final防止子类覆盖)
public final void processOrder() {
validateOrder();
calculateTotal();
applyDiscount();
processPayment();
sendConfirmation();
}
// 具体方法(通用实现)
private void validateOrder() {
System.out.println("验证订单基本信息...");
}
// 抽象方法(子类必须实现)
protected abstract void processPayment();
// 钩子方法(子类可选覆盖)
protected void applyDiscount() {
// 默认无折扣
}
// 具体方法
private void sendConfirmation() {
System.out.println("发送订单确认邮件...");
}
}
// 具体子类
public class AlipayOrderProcessor extends OrderProcessor {
@Override
protected void processPayment() {
System.out.println("使用支付宝支付...");
}
@Override
protected void applyDiscount() {
System.out.println("应用支付宝专属折扣...");
}
}
3. 模式应用场景分析
3.1 典型使用场景
模板方法模式特别适用于以下情况:
- 多个类有相同的行为模式,但具体实现不同
- 需要控制子类扩展的粒度
- 存在多个步骤的算法,其中某些步骤需要灵活变化
3.2 实际案例分享
在我参与的一个跨平台UI框架开发中,我们使用模板方法模式处理不同平台的渲染流程:
python复制class UIRenderer:
def render(self):
self.setupCanvas()
self.drawBackground()
self.drawContent()
self.drawControls()
self.finalize()
def setupCanvas(self):
print("初始化画布")
def drawBackground(self):
print("绘制默认背景")
@abstractmethod
def drawContent(self): pass
@abstractmethod
def drawControls(self): pass
def finalize(self):
print("完成渲染并显示")
class MobileRenderer(UIRenderer):
def drawContent(self):
print("绘制移动端特有内容布局")
def drawControls(self):
print("添加移动端触控元素")
class DesktopRenderer(UIRenderer):
def drawContent(self):
print("绘制桌面端多栏布局")
def drawControls(self):
print("添加桌面端鼠标交互元素")
4. 模式实现关键点
4.1 模板方法设计技巧
- 算法骨架保护:模板方法通常应声明为final,防止子类意外修改算法结构
- 抽象方法命名:使用明确的动词命名(如doXXX、performXXX),清晰表达意图
- 钩子方法设计:提供合理的默认实现,让子类只覆盖必要的部分
4.2 与策略模式对比
初学者常混淆模板方法模式和策略模式,它们的核心区别在于:
| 特性 | 模板方法模式 | 策略模式 |
|---|---|---|
| 控制方向 | 父类控制整体流程 | 客户端选择具体策略 |
| 代码复用 | 通过继承实现 | 通过组合实现 |
| 扩展方式 | 子类扩展具体步骤 | 实现新策略接口 |
| 适用场景 | 算法步骤固定,部分实现可变 | 需要运行时切换不同算法实现 |
5. 高级应用与优化
5.1 模板方法链
复杂系统中可以构建多级模板方法:
javascript复制clas
