模板方法模式是設(shè)計模式行為型中最簡單的一種設(shè)計模式铸鹰。在實際中你甚至可能經(jīng)常用到辜昵,只是你自己不知道它是一種設(shè)計模式罷了掉弛。
模板方法模式定義一個操作中的算法的骨架戒财,而將一些步驟延遲到子類中热监。模板方法使得子類可以不改變一個算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。
角色:
抽象類(AbstractClass): 定義抽象的原語操作饮寞,具體的子類將重定義它們以實現(xiàn)一個算法孝扛,實現(xiàn)一個模板方法,定義一個算法的骨架列吼。該模板方法不僅調(diào)用原語操作,也調(diào)用定義
具體子類 (ConcreteClass): 實現(xiàn)原語操作以完成算法中與特定子類相關(guān)的步驟苦始。
UML圖:
示例:假如你是一個老師寞钥,現(xiàn)在你要給你的學(xué)生出一份期末考試試卷。你班上有幾十個學(xué)生陌选,你將考慮如何為設(shè)計考試卷理郑。
? 經(jīng)分析顯然學(xué)生的試卷大部分類容都是一致的,唯一不一致的是姓名和答案咨油。老師設(shè)計好試卷您炉,只需要把試卷交個學(xué)生填寫答案即可。學(xué)生不需要把題目照抄一份役电。
所以我們需要把試卷抽象成基類邻吭,并且給學(xué)生留下填寫答案以及姓名的地方。
class TestPaper
{
public:
? ? void DoTestPaper(){
StudentName();
TestTitleOne();
TestTitleTwo();
};
void TestTitleOne(){
cout<<"題目一:X國的房價會降下來么宴霸?"<<endl;
AnswerOne();
}
void TestTitleTwo(){
cout<<"題目二:說說你的新聞聯(lián)播的看法?"<<endl;
AnswerTwo();
}
virtual void AnswerOne() = 0;
virtual void AnswerTwo() = 0;
virtual void StudentName() = 0;
};
顯然膏蚓,上面 AnswerOne, AnserTwo瓢谢,StudentName 就是學(xué)生答題的地方,學(xué)生不需要把題目也抄下來驮瞧。只需要實現(xiàn)我們的這三個方法就可以了氓扛。
例如:小紅的試卷
class XiaoHongTestPaper : public TestPaper
{
public:
void StudentName(){
cout<<"姓名:小紅"<<endl;
}
void AnswerOne(){
cout<<"答:相信X,相信國家,明年一定降下來论笔。"<<endl<<endl;
}
void AnswerTwo(){
cout<<"答:新聞聯(lián)播是我最喜歡的節(jié)目啊采郎。"<<endl<<endl;
}
};
小張的試卷:
class XiaoZhangTestPaper : public TestPaper
{
public:
void StudentName(){
cout<<"姓名:小張"<<endl;
}
void AnswerOne(){
cout<<"答:呵呵,還是去做你的X國夢吧狂魔。"<<endl<<endl;
}
void AnswerTwo(){
cout<<"答:我很幸福"<<endl<<endl;
}
};
客戶端:
int main(int argc, char* argv[])
{
XiaoHongTestPaper paper1;
paper1.DoTestPaper();
XiaoZhangTestPaper paper2;
paper2.DoTestPaper();
system("pause");
return 0;
}
總的來說模板方法模式
優(yōu)點:
1.模板方法模式在一個類中形式化地定義算法蒜埋,而由它的子類實現(xiàn)細(xì)節(jié)的處理。
2.模板方法是一種代碼復(fù)用的基本技術(shù)最楷。它們在類庫中尤為重要整份,它們提取了類庫中的公共行為。
缺點:
每個不同的實現(xiàn)都需要定義一個子類籽孙,這會導(dǎo)致類的個數(shù)增加烈评,系統(tǒng)更加龐大,設(shè)計也更加抽象犯建,但是更加符合“單一職責(zé)原則”讲冠,使得類的內(nèi)聚性得以提高。