Template Method模式
一. 意图
定义一个操作中的算法骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
二. 适用性
1. 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现
2. 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。首先识别现有代码中的不同之处,并且将不同之处分离为新的操作。最后,用一个调用这些新的操作的模板方法来替代这些不同的代码。
3. 控制子类扩展。模板方法只在特定点调用“hook”操作,这样就只允许在这些点进行扩展。
三. 结构
四. 代码
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<vector>
#include<math.h>
usingnamespacestd;
//templatemethodmode
classCAbstractClass
{
public:
//TemplateMethod
voidDrawControl()
{
DrawText();
DrawImage();
DrawDeometry();
}
protected:
//PrimitiveOperation1
virtualvoidDrawText(){}
//PrimitiveOperation2
virtualvoidDrawImage(){}
//PrimitiveOperation3
virtualvoidDrawDeometry(){}
};
classCButton:publicCAbstractClass
{
protected:
virtualvoidDrawText()
{
cout<<"DrawButtonText"<<endl;
}
virtualvoidDrawImage()
{
cout<<"DrawButtonImage"<<endl;
}
virtualvoidDrawDeometry()
{
cout<<"DrawButtonDeometry"<<endl;
}
};
classCList:publicCAbstractClass
{
protected:
virtualvoidDrawText()
{
cout<<"DrawListText"<<endl;
}
virtualvoidDrawImage()
{
cout<<"DrawListImage"<<endl;
}
virtualvoidDrawDeometry()
{
cout<<"DrawListDeometry"<<endl;
}
};
intmain()
{
cout<<"HelloWorld!"<<endl;
CButton*button=newCButton();
CList*list=newCList();
button->DrawControl();
list->DrawControl();
if(button!=NULL)
{
deletebutton;
button=NULL;
}
if(list!=NULL)
{
deletelist;
list=NULL;
}
return0;
}