目录
1.2 应用程序开发人员的template1_app.cpp
2.2 应用程序开发人员的template2_app.cpp
0.引入
在侯捷老师的系列课程《C++面向对象高级开发》这个课程的第12节中提到了这个设计模式.
C++中的虚函数的使用在一定程度上可以完成这种设计模式的构建.
1.没有用模板方法模式时的开发思路
1.1 程序库开发人员的template1_lib.cpp
// 程序库开发人员
class Library{
public :
void Step1(){
// ...
}
void Step3(){
// ...
}
void Step5(){
// ...
}
}
1.2 应用程序开发人员的template1_app.cpp
class Application{
public:
bool Step2(){
//...
}
bool Step4(){
//...
}
}
int main(){
Library lib();
Applcation app();
lib.Step1();
if(app.Step2()){
lib.Step3();
}
for(int i = 0;i < 4;i++){
app.Step4();
}
lib.Step5();
}
1.3 结构化软件设计流程
2.使用模板方法模式时的开发思路
2.1 程序库开发人员的template2_lib.cpp
// 一个代码规范:基类的析构函数要写成virtual的形式,这样去delete的时候就可以调用到子类的析构函数,否则可能出现调用不到子类析构函数的问题,可能导致出错.
// 稳定中有变化,假设此处的run,Step1,Step3,Step5是稳定的.
// 程序库开发人员
class Library{
public:
// 稳定的template method
void Run(){
Step1();
if(Step2()){ // 支持变化==>虚函数的多态调用
Step3();
}
for(int i = 0;i<4;i++){
Step(4); // 支持变化==>虚函数的多态调用
}
Step5();
}
virtual ~Library(){}
protected:
void Step1(){ // 稳定
// ...
}
void Step3(){ // 稳定
// ...
}
void Step5(){ // 稳定
// ...
}
virtual bool Step2() = 0;// 变化
virtual void Step4() = 0;// 变化
}
2.2 应用程序开发人员的template2_app.cpp
class Application : public Library{
public:
virtual bool Step2(){
//...子类实现重写
}
virtual bool Step4(){
//...子类实现重写
}
}
int main(){
Library* pLib = new Application();
pLib ->run();
delete pLib;
}
2.3 面向对象软件设计流程
3.模式定义
定义有一个操作中的算法的骨架(稳定),而将一些步骤延迟(变化)到子类中,Template Method是的子类
可以不改变(即复用)一个算法的结构就可以重新定义(override重写)该算法的某些特定步骤.
4.要点总结
Template Method模式是一个非常基础性的设计模式,在面向对象系统中有着大量的应用,它
用最简洁的机制(虚函数的多态)为很多应用框架提供了灵活的扩展点,是代码复用方面的基本
实现结构.
除了可以灵活对子步骤的变化外,“不要调用我的,让我来调用你”的反向控制结构是Template
Method的典型应用.
在具体实现方面,被Template Method调用的虚方法可以具有实现,也可以没有任何实现(抽象
方法,纯虚方法),但一般推荐它们设置为protected方法.
C语言和C++中的晚绑定机制:
C语言:
函数指针.
C++:
虚函数,其实其原理就是函数指针,虚函数表上挂了一个函数指针.