模板方法模式(Template Method)
一、什么是模板方法模式
模板方法模式是一种行为型设计模式,它在抽象类中定义算法的骨架(框架),并允许子类实现或重写其中的具体步骤。
二、解决了什么问题
- 当一个通用流程在多个子类中相似,但细节又有所不同时,可以使用模板方法来复用流程、统一规范。
- 避免子类完全独立实现一整套流程造成的重复代码。
三、模式的核心思想
- 在抽象类中写好 模板方法(流程框架)。
- 将流程中的某些步骤定义为抽象方法,交由子类实现。
- 一些通用步骤可以写死在抽象类中,避免重复。
四、结构图
抽象类 AbstractClass
├── 模板方法 templateMethod() // 定义算法框架
├── 基本方法 step1() // 子类可实现
└── 基本方法 step2() // 子类可实现
具体类 ConcreteClassA
└── 实现 step1() 和 step2()
具体类 ConcreteClassB
└── 实现 step1() 和 step2()

五、代码样例
- 场景:做一杯饮料(泡茶 / 冲咖啡)
- 需求:流程基本相同(烧水 → 倒杯子 → 加主料 → 加调料)
不使用设计模式
#include <iostream>
using namespace std;
class Tea {
public:
void makeTea() {
boilWater();
pourInCup();
addTeaLeaves();
addLemon();
}
private:
void boilWater() { cout << "烧水\n"; }
void pourInCup() { cout << "倒入茶杯\n"; }
void addTeaLeaves() { cout << "加入茶叶\n"; }
void addLemon() { cout << "加柠檬\n"; }
};
class Coffee {
public:
void makeCoffee() {
boilWater();
pourInCup();
addCoffeePowder();
addSugar();
}
private:
void boilWater() { cout << "烧水\n"; }
void pourInCup() { cout << "倒入咖啡杯\n"; }
void addCoffeePowder() { cout << "加入咖啡粉\n"; }
void addSugar() { cout << "加糖\n"; }
};
int main() {
Tea tea;
Coffee coffee;
cout << "制作茶:\n";
tea.makeTea();
cout << "\n制作咖啡:\n";
coffee.makeCoffee();
return 0;
}
会发现几个问题
- 重复代码很多(烧水、倒杯子等步骤)。
- 如果流程要改(比如加「冷却」步骤),所有类都要改。
使用设计模式
#include <iostream>
using namespace std;
// 抽象饮料类(模板)
class Beverage {
public:
virtual ~Beverage() {}
void make() { // 模板方法
boilWater();
pourInCup();
addMainIngredient();
addCondiments();
}
protected:
void boilWater() { cout << "烧水\n"; }
void pourInCup() { cout << "倒入杯子\n"; }
virtual void addMainIngredient() = 0; // 留给子类实现
virtual void addCondiments() = 0; // 留给子类实现
};
// 具体类:茶
class Tea : public Beverage {
protected:
void addMainIngredient() override { cout << "加入茶叶\n"; }
void addCondiments() override { cout << "加柠檬\n"; }
};
// 具体类:咖啡
class Coffee : public Beverage {
protected:
void addMainIngredient() override { cout << "加入咖啡粉\n"; }
void addCondiments() override { cout << "加糖\n"; }
};
int main() {
// 使用父类指针指向子类对象
Beverage* beverage1 = new Tea();
Beverage* beverage2 = new Coffee();
cout << "制作茶:\n";
beverage1->make();
cout << "\n制作咖啡:\n";
beverage2->make();
// 释放内存
delete beverage1;
delete beverage2;
return 0;
}
稳定与变化
在模板方法模式里:
-
稳定的部分
Beverage(抽象饮料类)里定义的流程:- 烧水 → 倒杯子 → 加主料 → 加调料
- 这些步骤的顺序和整体框架是 固定不变 的。
-
变化的部分
- 不同饮品的细节实现:
- 茶:加入茶叶,加柠檬
- 咖啡:加入咖啡粉,加糖
- 热巧克力:加入巧克力粉,加牛奶
- 这些属于 容易变化 的部分,由子类来实现。
- 不同饮品的细节实现:
变化依赖于稳定
模板方法模式的核心思想就是:
- 流程(稳定) → 写在父类(
Beverage)中,保证整体框架不会乱。 - 细节(变化) → 交给子类(
Tea、Coffee等)实现,保证可以灵活扩展。
这样一来:
- 如果以后要新增饮品(比如奶茶),只需要写一个新的子类继承
Beverage,而不用修改原有代码。 - 稳定部分(流程)不会被破坏,变化部分(实现)可以不断增加。
一句话总结:
模板方法模式就是通过 “变化依赖于稳定” 来实现可复用和可扩展。

2367

被折叠的 条评论
为什么被折叠?



