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

首頁 > 編程 > C++ > 正文

C++設計模式之組合模式(Composite)

2020-05-23 13:34:58
字體:
來源:轉載
供稿:網友

組合模式為了描述分支包含關系,也就是我們說的樹形關系,其對象分為枝和葉,每一枝可包含枝和葉,直到全部為葉節點。我們對枝和葉進行行為抽象,可認為枝和葉都是Component,而葉是最小的操作單元,其下不存在枝和葉,而枝作為Composite里面存有其下枝和葉的組件列表。

作用

將對象組合成樹形結構以表示“部分-整體”的層次結構,使得用戶對單個對象和組合對象的使用具有一致性

類視圖

C++,設計模式,組合模式

實現

 

#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;};//調用實現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;}

關于葉對節點的操作方法,如上面例子中add、remove、get等,其實是不需要的,因為基類申明的是純虛函數,所以必須進行實現,但是在調用時沒有任何意義,這就帶來了一些使用的風險,安全的做法是將這些操作從基類中移除,添加到composite類中,這樣在編譯時就可以檢查到調用問題,不過這樣做顯然又阻礙了接口的一致性,權衡利弊的選擇還需自己根據需要來。

應用場景

常用的樹形結構操作,如文件結構、菜單、組織結構等

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 顺平县| 双城市| 隆回县| 望江县| 马关县| 吴旗县| 同仁县| 绥棱县| 丽水市| 石首市| 曲麻莱县| 张家港市| 武宁县| 饶河县| 安新县| 临沂市| 秦皇岛市| 五指山市| 台南市| 平阴县| 闽侯县| 霍城县| 城口县| 景东| 洛阳市| 大竹县| 洛浦县| 甘孜| 临西县| 二连浩特市| 陵川县| 平山县| 鄂伦春自治旗| 桦南县| 武定县| 龙江县| 东乌珠穆沁旗| 顺平县| 乌苏市| 盐边县| 罗定市|