模板方法:
模板方法很好理解,说白了就是一个模板,往这个模板中添加内容就可以了,比如公司给每个应聘的人都发了一个简历模板,大家只需要在简历模板中按照条目填写自己的资料就可以了,大家所以填写的条目一样,而内容是根据自己的情况填写的,这就是模板。
在设计模式中,模板方法的意图是这样的:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。TemplateMethod 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
适用性:
一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。这是Opdyke 和Johnson 所描述过的“重分解以一般化”的一个很好的例子[ OJ93 ]。首先识别现 有代码中的不同之处,并且将不同之处分离为新的操作。最后,用一个调用这些新的操作的模板方法来替换这些不同的代码。
控制子类扩展。模板方法只在特定点调用“hook ”操作(参见效果一节),这样就只允许在这些点进行扩展。
#include <iostream>
using namespace std;
class AbstractClass
{
public:
void TemplateMethod()
{
PrimitiveOperation1();
cout << "TemplateMethod" << endl;
PrimitiveOperation2();
}
protected:
virtual void PrimitiveOperation1()
{
cout << "Default Operation1" << endl;
}
virtual void PrimitiveOperation2()
{
cout << "Default Operation2" << endl;
}
};
class ConcreteClassA : public AbstractClass
{
protected:
virtual void PrimitiveOperation1()
{
cout << "ConcreteA Operation1" << endl;
}
virtual void PrimitiveOperation2()
{
cout << "ConcreteA Operation2" << endl;
}
};
class ConcreteClassB : public AbstractClass
{
protected:
virtual void PrimitiveOperation1()
{
cout << "ConcreteB Operation1" << endl;
}
virtual void PrimitiveOperation2()
{
cout << "ConcreteB Operation2" << endl;
}
};
int main()
{
AbstractClass *pAbstractA = new ConcreteClassA;
pAbstractA->TemplateMethod();
AbstractClass *pAbstractB = new ConcreteClassB;
pAbstractB->TemplateMethod();
if (pAbstractA) delete pAbstractA;
if (pAbstractB) delete pAbstractB;
}