动机
- 在软件构建过程中,对于某一项任务,它常常有稳定的整体操作结构,但各个子步骤却有很多变化的需求,或者由于固有的原因(比如框架和应用之间的关系)而无法和任务的整体结构同时实现。
- 如何在确定稳定操作结构的前提下,来灵活应对各个子步骤的变化或者晚期实现需求?
模式定义
定义一个操作中的算法的骨架(稳定),而将一些步骤(变化)延迟到子类中。Template Method 使得子类可以复用一个算法的结构既可重定义(override 重写)该算法的某些特定步骤。未使用该设计模式
```cpp // 应用程序开发人员 class Application { public: bool Step2() {// 程序库开发人员
class Library {
public:
void Step1() {
// ...
}
void Step3() {
// ...
}
void Step5() {
// ...
}
}
} void Step4() {// ...
} }// ...
int main() { Library lib(); Application app();
lib.Step1();
if(app.Step2()) {
lib.Step3();
}
for(int i = 0; i < 4; i++) {
app.Step4();
}
lib.Step5();
}
<a name="zCCQU"></a>
### 实现2
```cpp
// 程序库开发人员
// 程序库开发人员将稳定Run流程写出来,
class Library {
public:
//稳定 template method
void Run() {
Step1();
if (Step2()) { //支持变换-->虚函数的多态调用
Step3();
}
for(int i = 0; i<4; i++) {
Step4(); //支持变换-->虚函数的多态调用
}
Step5();
}
virtual ~Library() { }
protected:
void Step1() { //稳定
// ...
}
void Step3() { //稳定
// ...
}
void Step5() { //稳定
// ...
}
virtual bool Step2() = 0; //变化(不做实现)
virtual bool Step4() = 0; //变化
};
// 应用程序开发人员
class Application : public Library {
protected:
virtual bool Step2() {
//... 子类重写实现
}
virtual void Step4() {
//... 子类重写实现
}
};
int main()
{
Library * plib = new Application();
lib->Run();
delete plib;
}