組合模式(
composite
)也叫部分-整體模式,是一種非常實用的設計模式,當我們發現需求中系統體現的是整體與區域性的層次關係,並且使用者希望將組合物件和單個物件一致性對待,這個時候「組合模式」的作用可以得到淋漓盡致地發揮了。
接觸過linux的人都知道linux的檔案系統採用的一種樹狀的層次結構,在linux系統中,目錄和普通檔案都被系統視為檔案,而目錄內又可以包含普通檔案,這樣linux的檔案系統就是以這種遞迴的方式定義。如果我們想描述這樣的資料結構,可以考慮採用組合模式。
組合模式的定義:將物件組合成樹形結構以表示「部分-整體」的層次結構。組合模式使得使用者對單個物件和組合物件的使用具有一致性。
從上面的定義我們可以得出組合模式的兩大特點:
1.從模式結構本身來看:模式本身體現的是一種整體與部分的層次結構關係;
2.從使用者的角度(客戶端)分析:整體(
分支結點)與部分(葉子結點)具有相同的介面,被形態上沒有差別。
組合模式的結構
本圖來自《大話設計模式》
舉例
下圖是一種組合模式的舉例:
c++實現**(針對以上面的舉例)
#include#include#includeusing namespace std;
class component//抽象類,使用者通過該介面來訪問其子部件
component(string str):name(str){};
virtual void add(component*)=0;//增加子部件
virtual void remove(component*)=0;//刪除子部件
virtual void display(int depth)=0;//遍歷結點,depth表示結點的深度
};class leaf:public component
//呼叫基類的建構函式初始化派生類的基類部分
void add(component* c)
//基類component呼叫其預設的建構函式
composite(string name):component(name){}
void add(component *c)
void remove(component *c)
void display(int depth) }
}; int main()
{ composite root("root");
/****新增root的孩子結點pa****/
leaf *pa=new leaf("leaf a");
root.add(pa);
/****新增root的孩子結點pb***/
leaf *pb=new leaf("leaf b");//新增root的孩子pb
root.add(pb);
/****新增root的分支結點comp***/
composite *comp1=new composite("composite x");
leaf *pxa=new leaf("leaf xa");
leaf *pxb=new leaf("leaf xb");
root.add(comp1);
/***新增comp1的分支結點comp2****/
composite *comp2=new composite("composite xy");
leaf *pxya=new leaf("leaf xya");
leaf *pxyb=new leaf("leaf xyb");
comp2->add(pxya);
comp2->add(pxyb);
comp1->add(comp2);
/***新增root的孩子結點pc和pd****/
leaf *pc=new leaf("leaf c");
leaf *pd=new leaf("leaf d");
root.add(pc);
root.add(pd);
cout<
測試結果
組合模式 C 實現
最近自學了設計模式,用c 自己實現的小例子,加深理解。組合模式 定義 將物件組合成樹形結構以表示 部分 整體 的層次結構。組合模式使得使用者對單個物件和組合物件的使用具有一致性。適用性 1 想要表示物件的部分 整體層次結構 2 希望使用者忽略組合物件與單個物件的不同,使用者將統一的使用組合結構中的所...
設計模式C 實現 組合模式
這個模式能夠建立乙個樹形結構,在同乙個結構中處理巢狀選單和選單項組。通過選單和項放在相同結構中,我們建立了乙個 整體 部分 層次結構,即由選單和選單項組成的物件樹。使用組合結構,我們能把相同的操作應用在組合和個別物件上。換句話說,在大多數情況下,我們可以忽略物件組合和個別物件之間的差別。為組合中的物...
設計模式 組合模式 C 實現
將物件組合成樹形結構以表示 部分 整體 的層次結構。composite模式使得使用者對單個物件和組合物件的使用具有一致性。1.模式定義 組合模式 composite pattern 將小物件組合成樹形結構,使使用者操作組合物件如同操作乙個單個物件。組合模式定義了 部分 整體 的層次結構,基本物件可以...