您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)C++設(shè)計(jì)模式之組合模式Composite的示例分析,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
組合模式為了描述分支包含關(guān)系,也就是我們說的樹形關(guān)系,其對象分為枝和葉,每一枝可包含枝和葉,直到全部為葉節(jié)點(diǎn)。我們對枝和葉進(jìn)行行為抽象,可認(rèn)為枝和葉都是Component,而葉是最小的操作單元,其下不存在枝和葉,而枝作為Composite里面存有其下枝和葉的組件列表。
作用
將對象組合成樹形結(jié)構(gòu)以表示“部分-整體”的層次結(jié)構(gòu),使得用戶對單個(gè)對象和組合對象的使用具有一致性
類視圖
實(shí)現(xiàn)
#include <iostream> #include <list> #include <string> using namespace std; class menu { public: menu(string in) : name(in){} ~menu(){} virtual void Add(menu*) = 0; virtual void Remove(menu*) = 0; virtual void showname() = 0; protected: string name; }; class Leafmenu : public menu { public: Leafmenu(string in) : menu(in){} ~Leafmenu(){} void showname() { cout<< "Leaf : " << name << endl; } virtual void Add(menu*){} virtual void Remove(menu*){} }; class Compositemenu : public menu { public: Compositemenu(string in) : menu(in){} void showname() { cout<< "Composit : "<< name << endl; list<menu*>::iterator iter = m_child.begin(); while (iter != m_child.end()) { (*iter)->showname(); iter++; } } virtual void Add(menu*m){ m_child.push_back(m); } virtual void Remove(menu*m){ m_child.remove(m); } private: list<menu*> m_child; }; //調(diào)用實(shí)現(xiàn) int main { Compositemenu mainmenu("Main"); /***添加File菜單****/ Compositemenu *pFile = new Compositemenu("File"); Leafmenu *pNew = new Leafmenu("New"); Leafmenu *pOpen = new Leafmenu("Open"); Leafmenu *pClose = new Leafmenu("Close"); pFile->Add(pNew); pFile->Add(pOpen); pFile->Add(pClose); mainmenu.Add(pFile); /***添加Edit菜單****/ Compositemenu *pEdit = new Compositemenu("Edit"); Leafmenu *pCopy = new Leafmenu("Copy"); Leafmenu *pPaste = new Leafmenu("Paste"); pEdit->Add(pCopy); pEdit->Add(pPaste); mainmenu.Add(pFile); Leafmenu *pExit = new Leafmenu("Exit"); Leafmenu *pHelp = new Leafmenu("Help"); mainmenu.Add(pExit); mainmenu.Add(pHelp); mainmenu.showname(); delete pNew; delete pOpen; delete pClose; delete pFile; delete pCopy; delete pPaste; delete pEdit; delete pExit; delete pHelp; }
關(guān)于葉對節(jié)點(diǎn)的操作方法,如上面例子中add、remove、get等,其實(shí)是不需要的,因?yàn)榛惿昝鞯氖羌兲摵瘮?shù),所以必須進(jìn)行實(shí)現(xiàn),但是在調(diào)用時(shí)沒有任何意義,這就帶來了一些使用的風(fēng)險(xiǎn),安全的做法是將這些操作從基類中移除,添加到composite類中,這樣在編譯時(shí)就可以檢查到調(diào)用問題,不過這樣做顯然又阻礙了接口的一致性,權(quán)衡利弊的選擇還需自己根據(jù)需要來。
應(yīng)用場景
常用的樹形結(jié)構(gòu)操作,如文件結(jié)構(gòu)、菜單、組織結(jié)構(gòu)等
關(guān)于“C++設(shè)計(jì)模式之組合模式Composite的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。