當(dāng)我們要完成在某一細(xì)節(jié)層次一致的一個過程或一系列步驟,但其個別步驟在更詳細(xì)的層次上的實現(xiàn)可能不同時,通常考慮用模板方法模式來處理。
模版方法模式,就是定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。模版方法使得子類可以不改變一個算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。
模板方法模式結(jié)構(gòu)圖
image
模板方法模式基本代碼
#include <iostream>
using namespace std;
class AbstractClass {
// 抽象類,其實就是一個抽象模板,定義并實現(xiàn)了一個模板方法。
// 這個模板方法一般是一個具體方法,給出了一個頂級邏輯的骨架,而邏輯的組成步驟在相應(yīng)的抽象操作中,推遲到了子類實現(xiàn)。
// 頂級邏輯也可能調(diào)用一些具體的方法。
public:
void TemplateMethod() { // 模板方法,給出了邏輯骨架,而邏輯的組成是一些相應(yīng)的抽象操作,推遲到子類實現(xiàn).
PrimitiveOperation1();
PrimitiveOperation2();
}
virtual void PrimitiveOperation1() = 0;
virtual void PrimitiveOperation2() = 0; // 一些抽象行為,放到子類實現(xiàn)
virtual ~AbstractClass() {}
};
class ConcreteClassA : public AbstractClass {
// ConcreteClass實現(xiàn)父類所定義的一個或多個抽象方法。
// 每個AbstractClass都可以有任意多個ConcreteClass與之對應(yīng),
// 而每一個ConcreteClass都可以給出這些抽象方法的不同實現(xiàn),從而使得頂級邏輯的實現(xiàn)各不相同。
public:
void PrimitiveOperation1() {
cout << "ConcreteClassA: PrimitiveOperation1 & ";
}
void PrimitiveOperation2() {
cout << "PrimitiveOperation2" << endl;
}
};
class ConcreteClassB : public AbstractClass {
public:
void PrimitiveOperation1() {
cout << "ConcreteClassB: PrimitiveOperation1 & ";
}
void PrimitiveOperation2() {
cout << "PrimitiveOperation2" << endl;
}
};
int main() {
AbstractClass* aa = new ConcreteClassA();
aa->TemplateMethod(); // ConcreteClassA: PrimitiveOperation1 & PrimitiveOperation2
AbstractClass* ab = new ConcreteClassB();
ab->TemplateMethod(); // ConcreteClassB: PrimitiveOperation1 & PrimitiveOperation2
delete aa;
delete ab;
return 0;
}
模版方法模式特點
模板方法模式是通過把不變的行為搬到父類,去除子類中的重復(fù)代碼來體現(xiàn)它的優(yōu)勢,提供了很好的代碼復(fù)用平臺。