標籤:
目的定義一個操作中的算的骨架,將一些步驟的具體實現延遲到子類中,模板方法模式使得子類可以不改變一個演算法的結構就可以重新定義該演算法的某些特定步驟。
案例一個含有Application和Document類的應用程式框架,Application類負責開啟一個外部文檔,當文檔中的內容讀入之後,就用Document來表示。在Application中存在方法openDocument進行文檔的操作:
void Application::openDocument(const char* name)
{
if(!canOpenDocument(name))
return;
Document* doc = createDocument();
if(doc != NULL)
{
m_docs->addDocument(doc);
aboutToOpenDocument(doc);
doc->open();
doc->read();
}
}
在Application的openDocument中定義了開啟一個文檔的每一個主要步驟,它檢查了文檔是否能被開啟,並建立與應用相關的Document對象,並且從檔案中讀入該Document,此時openDocument就是
模板方法。一個模版方法用一些抽象的操作定義一個演算法,而子類將重定義這些操作以提供具體的行為:
類Application提供需要子類重定義的操作:
class Application
{
public:
void openDocument(const char* name);
protected:
virtual void canOpenDocument(const char* name);
virtual void createDocument();
virtual void aboutToOpenDocument();
private:
vector<Document*> m_docs;
};
MyApplication自需要是實現自己需要重定義的操作:
class MyApplication : public Application
{
protected:
virtual Document* createDocument();
virtual void aboutToOpenDocument();
};
Document* MyApplication::createDocument()
{
return new MyDocument();
}
void aboutToOpenDocument()
{
// initialize doc object.
}
Document和MyDocument也是類似的實現。
適用性
- 一次性定義一個演算法的不變的部分,將可變的行為留給子類來實現。
- 各子類中公用的行為應該提取出來,並集中到一個公用父類中以避免代碼重複。
- 控制子類擴充。
Template Method - 模板方法模式