用做菜来理解设计模式之:模板方法模式(附代码示例)
一、一句话理解
模板方法模式就像炒菜的标准化流程:师傅规定好炒菜的步骤(热油→放主材→放调料→装盘),但允许徒弟根据不同的菜调整放主材和调料的细节。
二、生活场景类比
假设你要开一家饮品店:
- 所有饮品的制作流程都是:烧水→冲泡→倒杯→加料
- 咖啡需要"冲泡咖啡粉"和"加牛奶",奶茶需要"冲泡茶包"和"加珍珠"
- 老板制定标准流程卡(模板),员工根据具体饮品填空
三、代码示例(Java版)
java
// 模板类
abstract class Beverage {
// 模板方法(final防止子类修改流程)
public final void prepareRecipe() {
boilWater();
brew();
pourInCup();
addCondiments();
}
void boilWater() {
System.out.println("烧开水");
}
abstract void brew(); // 必须实现的抽象方法
void pourInCup() {
System.out.println("倒入杯子");
}
abstract void addCondiments(); // 必须实现的抽象方法
}
// 具体实现
class Coffee extends Beverage {
void brew() {
System.out.println("冲泡咖啡粉");
}
void addCondiments() {
System.out.println("加入牛奶和糖");
}
}
class Tea extends Beverage {
void brew() {
System.out.println("浸泡茶包");
}
void addCondiments() {
System.out.println("加入柠檬");
}
}
四、模式结构图解
[抽象类]
└── 模板方法(固定流程)
├── 具体步骤1(已实现)
├── 抽象步骤2(子类实现)
├── 具体步骤3(已实现)
└── 抽象步骤4(子类实现)
五、面试考点总结
- 核心思想:定义算法骨架,延迟步骤实现
- 关键实现:抽象类 + final模板方法 + 抽象方法/钩子方法
- 使用场景:
- 多个类有相同算法流程,但部分步骤不同
- 需要控制子类扩展范围时(如Spring的JdbcTemplate)
- 优点:
- 代码复用率提高60%+
- 便于维护(修改模板即可影响所有子类)
- vs 策略模式:
- 模板方法用继承(流程相同,步骤不同)
- 策略模式用组合(完全替换算法)
六、实际应用案例
Spring框架的JdbcTemplate:
- 固定流程:获取连接→创建语句→执行SQL→处理异常→释放连接
- 开发者只需实现:
- RowMapper(结果集映射)
- PreparedStatementSetter(参数设置)
记住这个模式的关键词:流程标准化,步骤个性化,父类掌控大局,子类专注细节。就像麦当劳的操作手册,保证全球口味一致,但允许不同地区调整配料比例。