//说些废话
1.其实没啥好说,因为模板方法模式用得实在太多了,只要是重写过子类方法的,80%以上应该也用过这个模式了
//部分资料来源
1.C++设计模式:http://www.jellythink.com/archives/407
2.程杰——大话设计模式
//适用场合
当不变和可变的方法在子类实现中混合在一起时,通过模板方法模式把这些行为搬移到单一的地方,帮助子类摆脱重复的不变行为的纠缠。
//正文
举个最简单的例子了:
#include <QCoreApplication>
#include <iostream>
using namespace std;
class Parent
{
public:
void drawShape()
{
cout<<"draw a ";
Shape();
cout<<"."<<endl;
}
protected:
virtual void Shape()
{
cout<<"";
}
};
class CircleChild : public Parent
{
protected:
virtual void Shape()
{
cout<<"Circle";
}
};
class SquareChild : public Parent
{
protected:
virtual void Shape()
{
cout<<"Square";
}
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Parent *target1 = new CircleChild();
target1->drawShape();
Parent *target2 = new SquareChild();
target2->drawShape();
return a.exec();
}
这个就是模板方法模式了,因为只有Shape不同,所以draw的部分全部上升到父类实现,drawShape也就是模板方法,给出逻辑骨架,逻辑的组成是抽象操作(Shpae),推迟到子类实现。
模板方法模式,定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。[DP]
所以模板方法就是把不变的东西提升到父类,避免子类重复代码,实现代码复用。
这就是模板方法模式的优势了。
//问题
1.
Q:什么时候用模板方法模式?
A:不变和可变你的行为混合在子类中,就用呗。
2.
Q:有什么该注意的吗?
A:记得让子类重写的方法放在protected,提供给外部调用的写public,也就是不变的public,变的protected。
3.
Q:跟其他模式的区别?
A:说说跟 装饰模式 和 原型模式 吧。
装饰模式是为了摆脱类爆炸,为对象增加功能用的。
原型模式是为了子类复制,其实可以看成是复制构造函数的调用,那个是公有set可变的行为,对象实例化后用。这个是类定义的时候protected提供给子类可变行为。(一个对类而言,一个对对象而言)
其实这个示例,加个clone,加个复制构造函数(直接默认也行,反正是浅拷贝),把shape()变成公有setShape(),就变成原型模式了。