1.設計模式總覽
1.1基本概念
模式就是一套被反覆使用解決某一問題的方案,包括三個基本元素(問題,解決方案,環境)
設計模式就是爲了可重用代碼,讓代碼更容易被他人理解,保證代碼可靠性的一種經驗總結。
設計模式的基礎是多態。多態的原理是編譯器爲每一個含有虛函數的子類和父類提前佈置了一個vptr指針,通過這個vptr指針找到一個虛函數表,根據虛函數表找到後來人寫的代碼去執行。
1.2分類
Design Patterns:Elements of Resualbel Software將設計模式歸納爲以下3個大類
創造型模式:通常和對象的創建有關,設計到對象實例化的方式。(共5種模式)
結構性模式:描述的是如何組合類和對象以獲得更大的結構。(共7種模式)
行爲型模式:用來對類或對象怎樣交互和怎樣分配職責進行描述(共11種模式)
1.3基本原則
高內聚,低耦合
1)開放封閉原則:
類的改動是通過增加代碼進行的,而不是修改源代碼。
2)單一職責原則:
類的職責要單一,對外只提供一種功能,而引起類變化的原因都應該只有一個。
//以上兩個原則可以舉例如下,想要修改只需要增加新的代碼而無需修改抽象父類
class AvBankWorker
{
public:
virtual void dothing() = 0;
private:
};
class SaveBanker :public AvBankWorker
{
public:
virtual void dothing() {
cout << "存款" << endl;
}
};
class PayBanker :public AvBankWorker
{
public:
virtual void dothing() {
cout << "繳費" << endl;
}
};
class MoveBanker :public AvBankWorker
{
public:
virtual void dothing() {
cout << "轉賬" << endl;
}
};
void main() {
AvBankWorker * bw = NULL;
bw = new MoveBanker;
bw->dothing();
delete bw;
system("Pause");
}
3)依賴倒置原則:
依賴於抽象(接口),不要依賴具體的實現(類),也就是針對接口編程。
4)接口隔離原則:
不應該強迫客戶的程序依賴他們不需要的接口方法,一個接口應該只提供一種對外功能,不應該強迫客戶的程序依賴他們不需要的接口方法。一個接口應該只提供一種對外功能,不應該把所有操作都封裝到一個接口中去。
5)里氏替換原則:
任何抽象類出現的地方都可以用他的實現類進行替換,實際就是虛擬機制,語言級別實現面向對象功能。
6)優先使用組合而不是繼承關係:
如果使用繼承,會導致父類的任何變換都可能影響到子類的行爲。如果使用對象組合,就降低了這種依賴關係。
7)迪米特法則:
一個對象應當對其他對象儘可能少的瞭解,從而降低各個對象之間的耦合,提高系統的可維護性。例如在一個程序中,各個模塊之間互相調用時,通常會提供一個同一的接口來實現。這樣其他模塊不需要了解另一個模塊的內部實現細節,這樣當一個模塊內部的實現發生改變時,不會影響其他模塊的使用。黑盒原理
2.創造型模式:
2.1工廠方法模式:用意是定義要給創建產品對象的工廠接口,將實際創建工作推遲到子類中。
2.2抽象工廠模式:意圖是提供一個創建一系列相關或者相互依賴的接口,而無需指定他們具體的類。
2.3建造者模式:意圖是將一個複雜的構建與其表示相分離,使得同樣的構建過程可以創建不同的表示。
2.4原型模式:用原型實例指定創建對象的種類,並且通過拷貝這些原型創建新的對象。
2.5單例模式:保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。