設(shè)計(jì)模式學(xué)習(xí)總結(jié)之六
八:Composite模式(即:復(fù)合模式)
復(fù)合模式旨在將遞歸處理,轉(zhuǎn)化為一種順序處理。明顯地,遞歸處理,相對(duì)較耗資源。也相對(duì)較為抽象些。而用一個(gè)Composite類對(duì)象來轉(zhuǎn)化處理
遞歸處理。將顯得直觀些。它與Decorator模式的區(qū)別是:Composite模式,旨在構(gòu)造一個(gè)類。這個(gè)類,將原本是遞歸組織的樹狀結(jié)構(gòu),轉(zhuǎn)換為直觀地轉(zhuǎn)化為
順序結(jié)構(gòu)。即:它重要于轉(zhuǎn)化表現(xiàn)。而Decorator模式(即:修飾模式),其重要簡(jiǎn)化管理原本系統(tǒng)類體系結(jié)構(gòu)。不至于將類繼承體系越來越深。同時(shí),不
至于讓原本設(shè)計(jì)好的類,越來越復(fù)雜化。同時(shí)又可以為原本類體系添加新的功能(即:書上所述的新的職責(zé))。
下面簡(jiǎn)要看下該模式的代碼結(jié)構(gòu):
class ClassNode
{
public:
//寫下構(gòu)造函數(shù)等
...
public:
virtual void Operation(void);
virtual void Add(ClassNode* pNode);
virtual void Remove(ClassNode* pNode);
virtual ClassNode* GetNode(int iIndex);
}
//Composite類
class Composite : public ClassNode
{
public:
typedef vector<ClassNode* > NODELISTVEC;
public:
void Operation(void)
{
for (NODELISTVEC::iterator iter = m_vNodeList.begin(); iter != m_vNodeList.end(); iter++)
iter->Operation();
}
void Add(ClassNode* pNode){//do something...}
void Remove(ClassNode* pNode){//do something...}
ClassNode* GetNode(int iIndex){//do something...}
private:
NODELISTVEC m_vNodeList;
}
//調(diào)用
int main(int argc, char* argv[])
{
Composite* MyCompositeForNodes = new ...;
ClassNode* xxx = new ...;//創(chuàng)建節(jié)點(diǎn)。當(dāng)然這里只是為了演示,所以只創(chuàng)建一個(gè)節(jié)點(diǎn)。一棵樹有可能有N個(gè)節(jié)點(diǎn)。
MyCom,positeForNodes.Add(xxx );
...
MyCompositeForNodes.Operation();
}
//個(gè)人認(rèn)為,該模式,很怪啊。。因?yàn)橥ㄟ^這樣轉(zhuǎn)換后,原本的父子關(guān)系就被破壞掉了。
//如果有大俠理解的深的話,,還請(qǐng)不吝補(bǔ)充下。。不盛感激。