將物件組合成樹形結構以表示「部分-整體」的層次結構。composite模式使得使用者對單個物件和組合物件的使用具有一致性。
1.模式定義
組合模式(composite pattern)將小物件組合成樹形結構,使使用者操作組合物件如同操作乙個單個物件。組合模式定義了「部分-整體」的層次結構,基本物件可以被組合成更大的物件,而且這種操作是可重複的,不斷重複下去就可以得到乙個非常大的組合物件,但這些組合物件與基本物件擁有相同的介面,因而組合是透明的,用法完全一致。
2.模式結構
組合模式包含如下角色:
component:
為組合中的物件宣告介面;
在適當的情況下,實現所有類共有介面的預設行為;
宣告乙個介面用於訪問和管理component的子元件。
leaf:
在組合中表示葉節點物件,葉節點沒有子節點;
在組合中定義葉節點的行為。
composite:
定義有子部件的那些部件的行為;
儲存子部件。
3.**分析conponent.h
#include
using namespace std;
class component
; virtual ~component() {};
virtual
void operation() = 0;
virtual
void add(component *) = 0;
virtual
void remove(component *) = 0;
virtual component *getchild(int) = 0;
virtual
string getname()
virtual
void print() = 0;
private:
string m_strcompname;
};
leaf.h
#include
#include "component.h"
using namespace std;
class leaf : public component
; virtual ~leaf() {};
void operation();
void add(component *pcomponent);
void remove(component *pcomponent);
component *getchild(int index);
void print();
};
leaf.cpp
#include
<
string
>
#include
"leaf.h"
void leaf::operation()
void leaf::add(component *pcomponent)
void leaf::remove(component *pcomponent)
component * leaf::getchild(int index)
void leaf::print()
composite.h
#include
#include
#include "component.h"
using
namespace
std;
class composite : public component
; virtual ~composite();
void operation();
void add(component *pcomponent);
void remove(component *pcomponent);
component *getchild(int index);
void print();
private:
vector
m_veccomp;
};
composite.cpp
#include
#include "leaf.h"
#include "composite.h"
composite::~composite()
m_veccomp.erase(it);
it = m_veccomp.begin();
}}void composite::operation()
void composite::add(component *pcomponent)
void composite::remove(component *pcomponent)
m_veccomp.erase(it);
break;}}
}component * composite::getchild(int index)
return m_veccomp[index - 1];
}void composite::print()
}
測試**:
4.模式優點使客戶端呼叫簡單,它可以一致使用組合結構或是其中單個物件,簡化了客戶端**。
容易在組合體內增加物件部件。客戶端不必因加入了新的部件而更改**。有利於功能的擴充套件。
5.模式缺點
需要抉擇使用透明方式還是安全方式。
透明方式違背了物件導向的單一職責原則;安全方式增加了客戶需要端判定的負擔。
6.總結
組合模式讓我們能用樹形方式建立物件的結構,樹裡面包含了composite以及leaf的物件。使用組合結構,我們能把相同的操作應用在composite和leaf上,即大多數情況下,我們可以忽略composite和leaf之間的差別,以相同的方式使用它們。為了保持透明性,leaf和composite都要繼承或實現component。
讓管理子構件的方法如add()、remove()、getchild()等出現在leaf中,是因為我們可以將leaf看作是沒有子構件的節點。
《設計模式》一書認為:在組合模式中,相對於安全性,我們比較強調透明性。對於透明式的組合模式中的leaf內不需要的方法可以使用空處理或者異常報告的方式來解決。
component中可以有乙個指向父親的指標,以便在遊走時更容易。比如刪除樹形結構中的某個子樹或葉節點(即composite或leaf)時會更加方便。
設計模式C 實現 組合模式
這個模式能夠建立乙個樹形結構,在同乙個結構中處理巢狀選單和選單項組。通過選單和項放在相同結構中,我們建立了乙個 整體 部分 層次結構,即由選單和選單項組成的物件樹。使用組合結構,我們能把相同的操作應用在組合和個別物件上。換句話說,在大多數情況下,我們可以忽略物件組合和個別物件之間的差別。為組合中的物...
設計模式C 實現 組合模式
這個模式能夠建立乙個樹形結構,在同乙個結構中處理巢狀選單和選單項組。通過選單和項放在相同結構中,我們建立了乙個 整體 部分 層次結構,即由選單和選單項組成的物件樹。使用組合結構,我們能把相同的操作應用在組合和個別物件上。換句話說,在大多數情況下,我們可以忽略物件組合和個別物件之間的差別。compon...
C 設計模式 組合模式
一.概述 組合模式,將物件組合成樹形結構以表示 部分 整體 的層次結構,組合模式使得使用者對單個物件和組合物件的使用具有一致性。結構 1.component 是組合中的物件宣告介面,在適當的情況下,實現所有類共有介面的預設行為。宣告乙個介面用於訪問和管理component子部件。2.leaf 在組合...