您的位置:首页 > 其它

template method(模板方法)

2019-10-03 16:15 1481 查看

一.引入

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 二.template method(模板方法)

 

代码示例:

一开始的代码:

template1_app.cpp:

//应用程序开发人员
class Application{
public:
bool Step2(){
//...
}

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();

}

对应的库的代码:

template1_lib.cpp:

 
//程序库开发人员
class Library{

public:
void Step1(){
//...
}

void Step3(){
//...
}

void Step5(){
//...
}
};

这里的主体程序流程,实际上框架开发者已经设计好了,常常是稳定的.

因此更好的解决方案是,库开发者把流程写好,一些需要开发者实现的接口定义好,留给开发者实现:

改进后的代码:

template2_lib.cpp:

//程序库开发人员
class Library{
public:
//稳定 template method
void Run(){

Step1();

if (Step2()) { //支持变化 ==> 虚函数的多态调用
Step3();
}

for (int i = 0; i < 4; i++){
Step4(); //支持变化 ==> 虚函数的多态调用
}

Step5();

}
 virtual ~Library(){ }

protected:  //采用protected,让子类能够访问到.

void Step1() { //稳定
//.....
}
void Step3() {//稳定
//.....
}
void Step5() { //稳定
//.....
}

virtual bool Step2() = 0;//变化
virtual void Step4() =0; //变化
};

template2_app.cpp:

//应用程序开发人员
class Application : public Library {
protected:
virtual bool Step2(){
//... 子类重写实现
}

virtual void Step4() {
//... 子类重写实现
}
};

int main()
{
Library* pLib=new Application();
lib->Run();

delete pLib;
}
}

注意一下:

基类的析构函数要写成虚的,否则调用不到子类的析构函数,因为如果不是虚函数的话,

基类指针只能找到基类的析构函数,delete时只会调用基类的析构函数;而析构函数为虚函数时,则基类指针可以找到子类对应的析构函数.

 

 

 

 

 

 红色部分时稳定的,蓝色部分是变化的.

 

 

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: