已經有很多前輩寫過關於設計模式的很多經典文章,我在這裡記錄一些自己的學習進程,表示自己還在學習好了。
先從借來的大話設計模式看起,今天是第一章和第二章。
第一章 簡單uml
uml中繼承很容易記住。
說些不怎麼好記住的,如 依賴 ,關聯 ,彙總,組合 。
依賴用 虛線箭頭表示,在代碼上是類的方法用到(傳入或引用)了 被依賴的類。
關聯:有名的客戶和訂單的關係以及公司和員工的關係,都是關聯關係。還有就是我和我的單車的例子,他們都是一種“擁有”的關係。表現在代碼上,就是一個類包含另一個類的執行個體,通常表現為被關聯類別以類屬性的形式出現在關聯類別的類定義中,也可以表現為關聯類別引用了一個類型為被關聯類別的全域變數。關聯可以使單向的,也可以使雙向的。
public class Company{ private Employee employee; public Employee GetEmployee() { return employee; } public void SetEmployee(Employee employee) { this.employee = employee; } //公司運作 public void Run() { employee.StartWorking(); }}
彙總
彙總(aggregation)是一種特殊的聯絡,它表明了“部分”到“整體”的關係,顯著的特點就是不能包含迴圈的聯絡(就是說,部分中不能包含整體)。如:
class
Node
{
private:
vector<Node*> itsNodes;
};
上述代碼只有當子節點不會成為父節點的父節點時(即,必須是樹結構,不能是圖結構),才能稱之為彙總。
組合
組合(composition)跟彙總幾乎相同,唯一的區別就是“部分”不能脫離“整體”單獨存在,就是說, “部分”的生命期不能比“整體”還要長。例如:
class Car
{
public:
virtual ~Car() {delete itsCarb;}
private:
Carburetor* itsCarb
};
彙總和組合區別:用C++程式的話,彙總就像是類中的指標成員,而組合就是類中的成員。需要該類來建立對象。//這裡說的應該不是很準確
關聯與依賴的區別:有說“關聯本身即是一種依賴”,亦有說“依賴是一種弱關聯”,其實說來說去是一檔子事。依賴和關聯都是說一個類用到了另一個類。其區別在於一個是使用,一個是擁有。
關聯和彙總 的區別是: 彙總是一對多的。而關聯貌似是一對一的。 關聯只有一個類知道另外一個類的公用屬性和操作。包含了另一個對象的引用。
而彙總則是擁有被彙總類的指標,要在非成員方法裡面使用。
總結一下:
依賴、關聯、彙總、組合、繼承、實現
耦合度依次提高。
區分心法:
1.成員變數中沒有B類,方法中使用,則為依賴。
2.成員變數中有B類的引用或指標,並不參與B對象的構建,則是關聯。
3.成員變數中有B類的指標,方法中使用,則是彙總關係。
4.成員變數或建構函式中有B類的實現對象,則是組合。
第二章 原廠模式和策略模式
原廠模式用到的是依賴模式的關係。
而策略模式用到的是彙總模式。
策 略模式是一種第一一系列演算法的方法,從概念上來看,所有這些演算法完成的都是相同的工作,只是實現不同,可以以相同的方式調用所有的演算法,減少了各種演算法類與使用演算法類之間的耦合。並且繼承類有助於定義一系列可供重複用的演算法或行為。每個演算法都有自己單獨的類可以單獨測試。
與工廠結合可以簡化用戶端,將具體的實現轉移到策略模式中。