动机
- 在软件构建过程中,对于某一项任务,它常常有稳定的整体操作结构,但各个子步骤却有很多变化的需求,或者由于固有的原因(比如框架和应用之间的关系)而无法和任务的整体结构同时实现。
- 如何在确定稳定操作结构的前提下,来灵活应对各个子步骤的变化或者晚期实现需求?
模式定义
定义一个操作中的算法的骨架(稳定),而将一些步骤(变化)延迟到子类中。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 methodvoid 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;}
