1. 程式人生 > >最常用的設計模式---模板方法模式(C++實現)

最常用的設計模式---模板方法模式(C++實現)

模板方法模式是設計模式行為型中最簡單的一種設計模式。在實際中你甚至可能經常用到,只是你自己不知道它是一種設計模式罷了。
模板方法模式定義一個操作中的演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。
角色:
抽象類(AbstractClass): 定義抽象的原語操作,具體的子類將重定義它們以實現一個演算法,實現一個模板方法,定義一個演算法的骨架。該模板方法不僅呼叫原語操作,也呼叫定義
具體子類 (ConcreteClass): 實現原語操作以完成演算法中與特定子類相關的步驟。

UML圖:

       

示例:假如你是一個老師,現在你要給你的學生出一份期末考試試卷。你班上有幾十個學生,你將考慮如何為設計考試卷。
  經分析顯然學生的試卷大部分類容都是一致的,唯一不一致的是姓名和答案。老師設計好試卷,只需要把試卷交個學生填寫答案即可。學生不需要把題目照抄一份。

所以我們需要把試卷抽象成基類,並且給學生留下填寫答案以及姓名的地方。

class TestPaper
{
public:
    void DoTestPaper(){
		StudentName();
		TestTitleOne();
		TestTitleTwo();
	};

	void TestTitleOne(){
		cout<<"題目一:X國的房價會降下來麼?"<<endl;
		AnswerOne();
	}

	void TestTitleTwo(){
		cout<<"題目二:說說你的新聞聯播的看法?"<<endl;
		AnswerTwo();
	}

	virtual void AnswerOne() = 0;
	virtual void AnswerTwo() = 0;
	virtual void StudentName() = 0;
};

顯然,上面 AnswerOne, AnserTwo,StudentName 就是學生答題的地方,學生不需要把題目也抄下來。只需要實現我們的這三個方法就可以了。

例如:小紅的試卷

class XiaoHongTestPaper : public TestPaper
{
public:
	void StudentName(){
		cout<<"姓名:小紅"<<endl;
	}
	void AnswerOne(){
		cout<<"答:相信X,相信國家,明年一定降下來。"<<endl<<endl;
	}
	void AnswerTwo(){
		cout<<"答:新聞聯播是我最喜歡的節目啊。"<<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;
}

總的來說模板方法模式

優點:
1.模板方法模式在一個類中形式化地定義演算法,而由它的子類實現細節的處理。
2.模板方法是一種程式碼複用的基本技術。它們在類庫中尤為重要,它們提取了類庫中的公共行為。
缺點:
每個不同的實現都需要定義一個子類,這會導致類的個數增加,系統更加龐大,設計也更加抽象,但是更加符合“單一職責原則”,使得類的內聚性得以提高。