国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > C++ > 正文

C++設(shè)計(jì)模式之組合模式(Composite)

2020-01-26 13:43:53
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

組合模式為了描述分支包含關(guān)系,也就是我們說(shuō)的樹(shù)形關(guān)系,其對(duì)象分為枝和葉,每一枝可包含枝和葉,直到全部為葉節(jié)點(diǎn)。我們對(duì)枝和葉進(jìn)行行為抽象,可認(rèn)為枝和葉都是Component,而葉是最小的操作單元,其下不存在枝和葉,而枝作為Composite里面存有其下枝和葉的組件列表。

作用

將對(duì)象組合成樹(shù)形結(jié)構(gòu)以表示“部分-整體”的層次結(jié)構(gòu),使得用戶(hù)對(duì)單個(gè)對(duì)象和組合對(duì)象的使用具有一致性

類(lèi)視圖

實(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)于葉對(duì)節(jié)點(diǎn)的操作方法,如上面例子中add、remove、get等,其實(shí)是不需要的,因?yàn)榛?lèi)申明的是純虛函數(shù),所以必須進(jìn)行實(shí)現(xiàn),但是在調(diào)用時(shí)沒(méi)有任何意義,這就帶來(lái)了一些使用的風(fēng)險(xiǎn),安全的做法是將這些操作從基類(lèi)中移除,添加到composite類(lèi)中,這樣在編譯時(shí)就可以檢查到調(diào)用問(wèn)題,不過(guò)這樣做顯然又阻礙了接口的一致性,權(quán)衡利弊的選擇還需自己根據(jù)需要來(lái)。

應(yīng)用場(chǎng)景

常用的樹(shù)形結(jié)構(gòu)操作,如文件結(jié)構(gòu)、菜單、組織結(jié)構(gòu)等

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 湘阴县| 凤城市| 驻马店市| 镇沅| 沈阳市| 襄樊市| 龙山县| 平舆县| 南城县| 会昌县| 静宁县| 泰安市| 廊坊市| 绥中县| 红桥区| 丰宁| 阿克陶县| 大丰市| 岫岩| 瓮安县| 东城区| 洛隆县| 丁青县| 六安市| 时尚| 孟津县| 三亚市| 克拉玛依市| 北宁市| 巴林右旗| 定南县| 绥宁县| 永川市| 宁德市| 安徽省| 霍林郭勒市| 游戏| 平塘县| 焉耆| 樟树市| 北海市|