設計模式 組合模式 C 實現

2021-08-08 14:42:11 字數 3605 閱讀 1389

將物件組合成樹形結構以表示「部分-整體」的層次結構。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 在組合...