声明:本博文篇幅短,适合review。
一、概念
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
二、模式结构图
class AbstractClass
{
public:
virtual ~AbstractClass();
void templateMethod(){
this->primitive1();
this->primitive2();
}
protected:
virtual void primitive1() = 0;
virtual void primitive2() = 0;
AbstractClass();
};
class ConcreteClass1 : public AbstractClass
{
public:
ConcreteClass1();
~ConcreteClass1();
protected:
void primitive1();
void primitive2();
};
class ConcreteClass2 : public AbstractClass
{
public:
ConcreteClass2();
~ConcreteClass2();
protected:
void primitive1();
void primitive2();
};
void main(){
AbstractClass * p1 = new ConcreteClass1();
AbstractClass * p2 = new ConcreteClass2();
p1->templateMethod();
p2->templateMethod();
}
三、例子
class FormatPicture
{
public:
virtual ~FormatPicture();
void transform(){
this->read();
this->save();
}
protected:
void read(){
cout<<"读取其他格式的图片 "<<endl;
}
virtual void save() = 0;
FormatPicture();
};
class FormatPNG : public FormatPicture
{
public:
FormatPNG();
~FormatPNG();
protected:
void save(){
cout<<"保存为png。。。"<<endl;
}
};
class FormatJPG : public FormatPicture
{
public:
FormatJPG();
~FormatJPG();
protected:
void save(){
cout<<"保存为jpg。。。"<<endl;
}
};
void main(){
FormatPicture * f1 = new FormatPNG();
FormatPicture * f2 = new FormatJPG();
f1->transform();
f2->transform();
}
四、优缺点
1、优点
a、提高了代码复用性。
b、符合开闭原则,依赖倒置原则。
2、缺点
a、每个不同的实现都需要定义一个子类,这会导致类的个数增加。