組合模式(composite pattern):組合多個物件形成樹形結構以表示具有「整體—部分」關係的層次結構。組合模式對單個物件(即葉子物件)和組合物件(即容
器物件)的使用具有一致性,組合模式又可以稱為「整體—部分」(part-whole)模式,它是一種物件結構型模式。
將物件組合成樹形結構以表示部分-整體的層次結構,組合模式使得使用者對單個物件跟組合物件使用具有一致性。
注意兩個字「樹形」。這種樹形結構在現實生活中隨處可見,比如乙個集團公司,它有乙個母公司,下設很多家子公司。不管是母公司還是子公司,都有各自直屬的財務部、人力資源部、銷售部等。對於母公司來說,不論是子公司,還是直屬的財務部、人力資源部,都是它的部門。整個公司的部門拓撲圖就是乙個樹形結構。
下面給出組合模式的uml圖。從圖中可以看到,financedepartment、hrdepartment兩個類作為葉結點,因此沒有定義新增函式。而concretecompany類可以作為中間結點,所以可以有新增函式。那麼怎麼新增呢?這個類中定義了乙個鍊錶,用來放新增的元素。
相應的**實現為:
class company
virtual ~company(){}
virtual void add(company *pcom){}
virtual void show(int depth) {}
protected:
string m_name;
};
//具體公司
class concretecompany : public company
virtual ~concretecompany() {}
void add(company *pcom) //位於樹的中間,可以增加子樹
void show(int depth)
private:
listm_listcompany;
};
//具體的部門,財務部
class financedepartment : public company
virtual ~financedepartment() {}
virtual void show(int depth) //只需顯示,無限新增函式,因為已是葉結點
上面的實現方式有缺點,就是記憶體的釋放不好,需要客戶自己動手,非常不方便。有待改進,比較好的做法是讓concretecompany類來釋放。因為所有的指標都是存在concretecompany類的鍊錶中。c++的麻煩,沒有垃圾**機制。
其實組合模式類似與 資料結構中的樹形式 儲存 以前我們做的是簡單的有序二叉樹 儲存僅僅是int 其實可以將int 抽象化為乙個物件 放置物件 也可以。
透明方式 跟 安全方式
設計模式 結構模式 外觀模式
外觀模式 fasade pattern 隱藏系統的複雜性 將一系列複雜的業務交給乙個外觀類來供使用者呼叫,使用者不用對具體的業務實現關注太多。最好理解的是電腦開關機的案例 computer的power on 或者power off是cpu,memory和disk的開關的總體結果,但是使用者無需知道這...
Facade 結構模式
為子系統中的一組介面提供乙個一致的介面,facade 模式定義了乙個高層介面,這個介面使得這一子系統更加容易使用。1 設計初期階段,應該有意識的將不同層分離,層與層之間建立外觀模式。2 開發階段,子系統越來越複雜,增加外觀模式提供乙個簡單的呼叫介面。3 維護乙個大型遺留系統的時候,可能這個系統已經非...
結構模式 立面
facade模式通過將複雜子系統封裝在單個介面物件中來促進子系統與其可能的許多客戶端的分離。這減少了子系統之間的通訊和依賴性,並降低了系統的複雜性。立面圖案屬於結構模式。根據 gamma等人的design patterns,這種模式的目的是 為子系統中的一組介面提供統一介面。facade定義了乙個更...