定义一个操作中的算法的骨架(稳定),而将一些步骤的实现延迟(变化)到子类中。Template Method使得子类可以不改变(复用)一个算法的结构即可重定义(override重写)该算法的某些特定步骤。
早绑定与晚绑定
区分稳定与变化
要点总结:
-
非常基础的设计模式
-
最简洁的机制(虚函数的多态性)
-
提供扩展点(继承+多态)
-
反向控制结构(Lib控制App),Lib调用App
上述实例:
- run()是固定的
- 运行时,Lib的run()调用App的Step2、Step4
-
具体实现中,被Template Method调用的方法可以有也可以没有具体实现,一般推荐设置为protected方法
模板方法就是C++的虚函数多态机制实现的运行时动态绑定,只不过稳定的算法框架是在基类中固定,变化的部分用虚函数封装,来实现子类的动态绑定。
// 面向对象
class Library {
public:
// 稳定中包含变化
void Run() {
Step1();
if (Step2()) { // 支持变化 虚函数多态调用
Step3();
}
for (...) {
Step4();// 支持变化 虚函数多态调用
}
Step5();
}
virtual ~Library();
private:
Step1();
Step3();
Step5();
virtual Step2();
virtual Step4();
};
class Application : public Library {
public:
Step4();
Step5();
};
int main() {
Library* pLib = new Application;
pLib->run();// run()并不是虚函数,此处调用基类的run(),但是在run()内部的Step2()、Step4()又是虚函数,调用的时Application的Step2()、Step4()
delete pLib;
...
}