這個模式能夠建立乙個樹形結構,在同乙個結構中處理巢狀選單和選單項組。通過選單和項放在相同結構中,我們建立了乙個「整體/部分」層次結構,即由選單和選單項組成的物件樹。使用組合結構,我們能把相同的操作應用在組合和個別物件上。換句話說,在大多數情況下,我們可以忽略物件組合和個別物件之間的差別。
component:
為組合中的物件宣告介面;
在適當情況下實現所有類共有介面的預設行為;
宣告乙個介面用於訪問管理component的子元件
在遞迴結構中定義乙個介面,用於訪問乙個父部件,並在合適的情況下實現它
leaf:
在組合中表示葉節點物件,葉節點沒有子節點,並定義其行為
composite:
定義有子部件的那些部件的行為
儲存子部件
實現與子部件有關的操作
client:
通過component介面操作組合件和個別物件。
在迭代器例子中,我們希望在午餐餐單中增加乙份跌點餐單,也就是說希望能讓甜點餐單變成午餐餐單的乙個元素。
我們可以用組合模式解決這個問題:一開始我們建立乙個元件介面作為餐單和選單項的共同介面,讓我們能夠用統一的做法來處理選單和選單項。換句話說,我們可以針對選單或選單項呼叫相同的方法。然後實現選單項和組合選單元件,以及他們各自的方法。
#include
#include
#include
#include
using namespace std;
//選單和選單項共同的元件
class menucomponent
virtual void remove(menucomponent* menucomponent)
virtual menucomponent* getchild(int i)
virtual string getname()
virtual string getdescription()
virtual double getprice()
virtual void print() };
//選單項類
class menuitem : public menucomponent
menuitem(string na, string descrip, double pric)
string getname()
string getdescription()
double getprice()
void print()
}} menucomponent* getchild(int i)
string getname()
string getdescription()
void print() }
private:
vector pmenucomponents;
string name;
string description;
};//服務生類
class waitress
void printmenu()
private:
menucomponent* allmenus;
};//客戶**
int main()
執行結果:
allmenus, all menus combined
--------------
pancakehouse menu, breakfast
--------------
dinermenu, lunch
--------------
pasta, 3.89 ---spaheti with sauce
dessertmenu, dessert of coure!
--------------
apple pie, 1.59 ---app pie with a cruse
請按任意鍵繼續. . .
設計模式C 實現 組合模式
這個模式能夠建立乙個樹形結構,在同乙個結構中處理巢狀選單和選單項組。通過選單和項放在相同結構中,我們建立了乙個 整體 部分 層次結構,即由選單和選單項組成的物件樹。使用組合結構,我們能把相同的操作應用在組合和個別物件上。換句話說,在大多數情況下,我們可以忽略物件組合和個別物件之間的差別。為組合中的物...
設計模式 組合模式 C 實現
將物件組合成樹形結構以表示 部分 整體 的層次結構。composite模式使得使用者對單個物件和組合物件的使用具有一致性。1.模式定義 組合模式 composite pattern 將小物件組合成樹形結構,使使用者操作組合物件如同操作乙個單個物件。組合模式定義了 部分 整體 的層次結構,基本物件可以...
C 設計模式 組合模式
一.概述 組合模式,將物件組合成樹形結構以表示 部分 整體 的層次結構,組合模式使得使用者對單個物件和組合物件的使用具有一致性。結構 1.component 是組合中的物件宣告介面,在適當的情況下,實現所有類共有介面的預設行為。宣告乙個介面用於訪問和管理component子部件。2.leaf 在組合...