C++設(shè)計(jì)模式之組合模式(Composite)
組合模式為了描述分支包含關(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),使得用戶對(duì)單個(gè)對(duì)象和組合對(duì)象的使用具有一致性
類視圖

實(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)榛惿昝鞯氖羌兲摵瘮?shù),所以必須進(jìn)行實(shí)現(xiàn),但是在調(diào)用時(shí)沒(méi)有任何意義,這就帶來(lái)了一些使用的風(fēng)險(xiǎn),安全的做法是將這些操作從基類中移除,添加到composite類中,這樣在編譯時(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í)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
VC++ 字符串String MD5計(jì)算小工具 VS2008工程
基于字符串加密的MD5算法,VS2008 VC++,多字節(jié)編譯工程。主要代碼如下,實(shí)現(xiàn)了ANSI字符串加密與Unicode字符串加密,需要的朋友可以參考下2017-07-07
C++實(shí)現(xiàn)LeetCode(173.二叉搜索樹(shù)迭代器)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(173.二叉搜索樹(shù)迭代器),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
C++?Boost?Accumulators累加器詳細(xì)講解
Boost是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱。Boost庫(kù)是一個(gè)可移植、提供源代碼的C++庫(kù),作為標(biāo)準(zhǔn)庫(kù)的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開(kāi)發(fā)引擎之一,是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱2022-11-11
循環(huán)隊(duì)列詳解及隊(duì)列的順序表示和實(shí)現(xiàn)
這篇文章主要介紹了循環(huán)隊(duì)列詳解及隊(duì)列的順序表示和實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下2016-12-12
C++的try塊與異常處理及調(diào)試技術(shù)實(shí)例解析
這篇文章主要介紹了C++的try塊與異常處理及調(diào)試技術(shù)實(shí)例解析,有助于讀者加深對(duì)try塊調(diào)試技術(shù)的認(rèn)識(shí),需要的朋友可以參考下2014-07-07

