模闆方法:
模闆方法很好了解,說白了就是一個模闆,往這個模闆中添加内容就可以了,比如公司給每個應聘的人都發了一個履歷模闆,大家隻需要在履歷模闆中按照條目填寫自己的資料就可以了,大家是以填寫的條目一樣,而内容是根據自己的情況填寫的,這就是模闆。
在設計模式中,模闆方法的意圖是這樣的:定義一個操作中的算法的骨架,而将一些步驟延遲到子類中。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;
}