亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

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

2020-05-23 14:21:15
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
這篇文章主要介紹了C++設(shè)計(jì)模式之組合模式,本文講解什么是組合模式、組合模式的優(yōu)點(diǎn)、組合模式實(shí)例等內(nèi)容,需要的朋友可以參考下
 
 

問(wèn)題描述

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

上圖,是一個(gè)公司的組織結(jié)構(gòu)圖,總部下面有多個(gè)子公司,同時(shí)總部也有各個(gè)部門,子公司下面有多個(gè)部門。如果對(duì)這樣的公司開發(fā)一個(gè)OA系統(tǒng),作為程序員的你,如何設(shè)計(jì)這個(gè)OA系統(tǒng)呢?先不說(shuō)如何設(shè)計(jì)實(shí)現(xiàn),接著往下看,看完了下面的內(nèi)容,再回過(guò)頭來(lái)想怎么設(shè)計(jì)這樣的OA系統(tǒng)。

什么是組合模式?

在GOF的《設(shè)計(jì)模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)》一書中對(duì)組合模式是這樣說(shuō)的:將對(duì)象組合成樹形結(jié)構(gòu)以表示“部分-整體”的層次結(jié)構(gòu)。組合(Composite)模式使得用戶對(duì)單個(gè)對(duì)象和組合對(duì)象的使用具有一致性。

組合模式(Composite)將小對(duì)象組合成樹形結(jié)構(gòu),使用戶操作組合對(duì)象如同操作一個(gè)單個(gè)對(duì)象。組合模式定義了“部分-整體”的層次結(jié)構(gòu),基本對(duì)象可以被組合成更大的對(duì)象,而且這種操作是可重復(fù)的,不斷重復(fù)下去就可以得到一個(gè)非常大的組合對(duì)象,但這些組合對(duì)象與基本對(duì)象擁有相同的接口,因而組合是透明的,用法完全一致。

我們這樣來(lái)簡(jiǎn)單的理解組合模式,組合模式就是把一些現(xiàn)有的對(duì)象或者元素,經(jīng)過(guò)組合后組成新的對(duì)象,新的對(duì)象提供內(nèi)部方法,可以讓我們很方便的完成這些元素或者內(nèi)部對(duì)象的訪問(wèn)和操作。我們也可以把組合對(duì)象理解成一個(gè)容器,容器提供各種訪問(wèn)其內(nèi)部對(duì)象或者元素的API,我們只需要使用這些方法就可以操作它了。

UML類圖

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

Component:

1.為組合中的對(duì)象聲明接口;
2.在適當(dāng)?shù)那闆r下,實(shí)現(xiàn)所有類共有接口的缺省行為;
3.聲明一個(gè)接口用于訪問(wèn)和管理Component的子組件。

Leaf:

1.在組合中表示葉節(jié)點(diǎn)對(duì)象,葉節(jié)點(diǎn)沒有子節(jié)點(diǎn);
2.在組合中定義葉節(jié)點(diǎn)的行為。

Composite:

1.定義有子部件的那些部件的行為;
2.存儲(chǔ)子部件。

Client:

3.通過(guò)Component接口操作組合部件的對(duì)象。

代碼實(shí)現(xiàn)

 

復(fù)制代碼代碼如下:

/*
** FileName     : CompositePatternDemo
** Author       : Jelly Young
** Date         : 2013/12/09
** Description  : More information, please go to http://www.49028c.com
*/
#include <iostream>
#include <string>
#include <vector>
using namespace std;
// 抽象的部件類描述將來(lái)所有部件共有的行為
class Component
{
public:
     Component(string name) : m_strCompname(name){}
     virtual ~Component(){}
     virtual void Operation() = 0;
     virtual void Add(Component *) = 0;
     virtual void Remove(Component *) = 0;
     virtual Component *GetChild(int) = 0;
     virtual string GetName()
     {
          return m_strCompname;
     }
     virtual void Print() = 0;
protected:
     string m_strCompname;
};
class Leaf : public Component
{
public:
     Leaf(string name) : Component(name)
     {}
     void Operation()
     {
          cout<<"I'm "<<m_strCompname<<endl;
     }
     void Add(Component *pComponent){}
     void Remove(Component *pComponent){}
     Component *GetChild(int index)
     {
          return NULL;
     }
     void Print(){}
};
class Composite : public Component
{
public:
     Composite(string name) : Component(name)
     {}
     ~Composite()
     {
          vector<Component *>::iterator it = m_vecComp.begin();
          while (it != m_vecComp.end())
          {
               if (*it != NULL)
               {
                    cout<<"----delete "<<(*it)->GetName()<<"----"<<endl;
                    delete *it;
                    *it = NULL;
               }
               m_vecComp.erase(it);
               it = m_vecComp.begin();
          }
     }
     void Operation()
     {
          cout<<"I'm "<<m_strCompname<<endl;
     }
     void Add(Component *pComponent)
     {
          m_vecComp.push_back(pComponent);
     }
     void Remove(Component *pComponent)
     {
          for (vector<Component *>::iterator it = m_vecComp.begin(); it != m_vecComp.end(); ++it)
          {
               if ((*it)->GetName() == pComponent->GetName())
               {
                    if (*it != NULL)
                    {
                         delete *it;
                         *it = NULL;
                    }
                    m_vecComp.erase(it);
                    break;
               }
          }
     }
     Component *GetChild(int index)
     {
          if (index > m_vecComp.size())
          {
               return NULL;
          }
          return m_vecComp[index - 1];
     }
     void Print()
     {
          for (vector<Component *>::iterator it = m_vecComp.begin(); it != m_vecComp.end(); ++it)
          {
               cout<<(*it)->GetName()<<endl;
          }
     }
private:
     vector<Component *> m_vecComp;
};
int main(int argc, char *argv[])
{
     Component *pNode = new Composite("Beijing Head Office");
     Component *pNodeHr = new Leaf("Beijing Human Resources Department");
     Component *pSubNodeSh = new Composite("Shanghai Branch");
     Component *pSubNodeCd = new Composite("Chengdu Branch");
     Component *pSubNodeBt = new Composite("Baotou Branch");
     pNode->Add(pNodeHr);
     pNode->Add(pSubNodeSh);
     pNode->Add(pSubNodeCd);
     pNode->Add(pSubNodeBt);
     pNode->Print();
     Component *pSubNodeShHr = new Leaf("Shanghai Human Resources Department");
     Component *pSubNodeShCg = new Leaf("Shanghai Purchasing Department");
     Component *pSubNodeShXs = new Leaf("Shanghai Sales department");
     Component *pSubNodeShZb = new Leaf("Shanghai Quality supervision Department");
     pSubNodeSh->Add(pSubNodeShHr);
     pSubNodeSh->Add(pSubNodeShCg);
     pSubNodeSh->Add(pSubNodeShXs);
     pSubNodeSh->Add(pSubNodeShZb);
     pNode->Print();
     // 公司不景氣,需要關(guān)閉上海質(zhì)量監(jiān)督部門
     pSubNodeSh->Remove(pSubNodeShZb);
     if (pNode != NULL)
     {
          delete pNode;
          pNode = NULL;
     }
     return 0;
}

 

實(shí)現(xiàn)要點(diǎn)

1.Composite的關(guān)鍵之一在于一個(gè)抽象類,它既可以代表Leaf,又可以代表Composite;所以在實(shí)際實(shí)現(xiàn)時(shí),應(yīng)該最大化Component接口,Component類應(yīng)為L(zhǎng)eaf和Composite類盡可能多定義一些公共操作。Component類通常為這些操作提供缺省的實(shí)現(xiàn),而Leaf和Composite子類可以對(duì)它們進(jìn)行重定義;

2.Component是否應(yīng)該實(shí)現(xiàn)一個(gè)Component列表,在上面的代碼中,我是在Composite中維護(hù)的列表,由于在Leaf中,不可能存在子Composite,所以在Composite中維護(hù)了一個(gè)Component列表,這樣就減少了內(nèi)存的浪費(fèi);

3.內(nèi)存的釋放;由于存在樹形結(jié)構(gòu),當(dāng)父節(jié)點(diǎn)都被銷毀時(shí),所有的子節(jié)點(diǎn)也必須被銷毀,所以,我是在析構(gòu)函數(shù)中對(duì)維護(hù)的Component列表進(jìn)行統(tǒng)一銷毀,這樣就可以免去客戶端頻繁銷毀子節(jié)點(diǎn)的困擾;

4.由于在Component接口提供了最大化的接口定義,導(dǎo)致一些操作對(duì)于Leaf節(jié)點(diǎn)來(lái)說(shuō)并不適用,比如:Leaf節(jié)點(diǎn)并不能進(jìn)行Add和Remove操作,由于Composite模式屏蔽了部分與整體的區(qū)別,為了防止客戶對(duì)Leaf進(jìn)行非法的Add和Remove操作,所以,在實(shí)際開發(fā)過(guò)程中,進(jìn)行Add和Remove操作時(shí),需要進(jìn)行對(duì)應(yīng)的判斷,判斷當(dāng)前節(jié)點(diǎn)是否為Composite。

組合模式的優(yōu)點(diǎn)

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

使用場(chǎng)景

1.你想表示對(duì)象的部分-整體層次結(jié)構(gòu);
2.希望用戶忽略組合對(duì)象與單個(gè)對(duì)象的不同,用戶將統(tǒng)一地使用組合結(jié)構(gòu)中的所有對(duì)象。

引用大話設(shè)計(jì)模式的片段:“當(dāng)發(fā)現(xiàn)需求中是體現(xiàn)部分與整體層次結(jié)構(gòu)時(shí),以及你希望用戶可以忽略組合對(duì)象與單個(gè)對(duì)象的不同,統(tǒng)一地使用組合結(jié)構(gòu)中的所有對(duì)象時(shí),就應(yīng)該考慮組合模式了。”

總結(jié)

通過(guò)上面的簡(jiǎn)單講解,我們知道了,組合模式意圖是通過(guò)整體與局部之間的關(guān)系,通過(guò)樹形結(jié)構(gòu)的形式進(jìn)行組織復(fù)雜對(duì)象,屏蔽對(duì)象內(nèi)部的細(xì)節(jié),對(duì)外展現(xiàn)統(tǒng)一的方式來(lái)操作對(duì)象,是我們處理更復(fù)雜對(duì)象的一個(gè)手段和方式?,F(xiàn)在再結(jié)合上面的代碼,想想文章開頭提出的公司OA系統(tǒng)如何進(jìn)行設(shè)計(jì)。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
91精品国产91久久久久久不卡| 欧洲日韩一区二区三区| 欧美h片在线观看| www.xxx国产| 五十路亲子中出中文字幕| 日韩美女网站| 久久精品理论片| 午夜精品国产精品大乳美女| 欧美极品免费| 国产精品第七十二页| 中日韩脚交footjobhd| 国产经典三级在线| 精品视频一区二区三区四区| 依依成人在线| 亚洲人视频在线观看| 情侣偷拍对白清晰饥渴难耐| 日本美女高清在线观看免费| 国产自产高清不卡| 国产探花一区二区三区| 成人午夜激情视频| 成人羞羞国产免费| 久久久久久艹| 精品婷婷色一区二区三区蜜桃| 337p亚洲精品色噜噜狠狠p| 777午夜精品视频在线播放| 黄色精品一二区| 欧美亚洲日本国产| 久久久久久久久久久亚洲| 免费观看羞羞视频网站| 国产色片在线观看| 日韩综合第一页| 成年人在线免费| ckplayer中文字幕| 色播在线观看| 亚洲五码在线| 欧美巨胸大乳hitomi| 亚洲美女黄色片| 国产精品日韩欧美一区二区三区| 欧美日韩一区二区三区电影| 另类图片激情| 老司机成人影院| 91精品欧美福利在线观看| 国产嫩草一区二区三区在线观看| 在线观看a网站| 国产黄色一级大片| 亚洲欧美在线视频免费| 色综合色综合久久综合频道88| 成人欧美一区二区三区| 色综合视频一区中文字幕| 国产乱精品一区二区三区| 久久精品国产68国产精品亚洲| 中文欧美日韩| 视频91a欧美| 精品日韩av一区二区| www.久久色| 国产精品免费久久久久影院| 久久久亚洲天堂| 久草av在线播放| 久久久999精品| 欧美做暖暖视频| а_天堂中文在线| 国产女人伦码一区二区三区不卡| 亚洲在线一区| 黄网址在线永久免费观看| 四虎影视最新网站入口在线观看| 在线视频欧美性高潮| 国产精品偷乱一区二区三区| 屁屁影院ccyy国产第一页| 超碰福利在线观看| 精品二区视频| 国产成人avxxxxx在线看| 永久免费看片在线播放| 国产精品视频最多的网站| 九九九久久久久久久| 国产精品久久久亚洲| www.麻豆av.com| 无码精品人妻一区二区| 日韩精品午夜| 欧美男女爱爱视频| 疯狂欧洲av久久成人av电影| 欧美与欧洲交xxxx免费观看| 精品无码av在线| 国产成人av免费在线观看| 亚洲女则毛耸耸bbw| a√资源在线| 国产精品进线69影院| 日韩欧美精品在线不卡| 性欧美一区二区三区| 亚洲精品视频一区| 亚洲国产日韩一区| 91网站免费| 秋霞伦理一区| 国产99在线观看| 亚洲青涩在线| 伊人国产视频| 欧美成人精品欧美一级乱| 亚洲高清资源| **爰片久久毛片| 久久99国产精品麻豆| 99在线观看视频| 国产精品国产三级国产aⅴ| 88xx成人网| 国产精品综合一区二区三区| 欧美色图色综合| 超薄肉色丝袜一二三| 色网站在线视频| 永久免费毛片在线观看| 中文字幕一区二区在线播放| 欧美一区二区三区精品电影| 最新av中文字幕| 久久99999| 成人女性文胸| 欧美日韩精品在线一区二区| 一本色道久久综合亚洲精品按摩| 免费视频中文字幕| 国产精品久久久久四虎| 一女三黑人理论片在线| 亚洲a一区二区三区| 五月婷婷开心中文字幕| 中文字幕 自拍偷拍| 国产乱淫av片免费| 国产麻豆午夜三级精品| 亚洲石原莉奈一区二区在线观看| 亚洲天堂伊人网| 亚洲精品视频网| 亚洲一区二区影视| 色欲av伊人久久大香线蕉影院| 亚洲蜜臀av乱码久久精品蜜桃| 你懂的在线免费观看| 国产精品久久久久久久久久直播| 影音先锋男人的网站| 2019中文字幕在线电影免费| 日韩在线xxx| 91农村精品一区二区在线| 亚洲欧美日韩一区二区三区在线| 欧美xxxxbbbb| 最新黄色网址在线观看| 综合分类小说区另类春色亚洲小说欧美| 日韩免费看片| 懂色av一区二区在线播放| 国产激情91久久精品导航| 日韩有码欧美| 久色视频在线| 欧美丝袜一区二区三区| 久久爱www久久做| 欧美日韩激情| 欧美亚洲色图视频| 桥本有菜亚洲精品av在线| 日本成熟性欧美| 另类图片激情| 最新版天堂资源在线| 亚洲一区二区三区四区在线免费观看| 亚洲欧美一区二区三区不卡| 天天干天天插天天操| 成人午夜视频精品一区| 亚洲成人av高清| 中文字幕999| 强乱中文字幕av一区乱码| 热舞福利精品大尺度视频| www高清在线视频日韩欧美| 欧美成人三级在线观看| 欲求不满中文字幕| 69久久夜色精品国产7777| 日本福利一区| 亚洲一区二区影视| 日韩精品一区二区三区四| 国产情侣第一页| 欧美xxxx性xxxxx高清视频| 成年网站免费入口在线观看| 校园春色 亚洲色图| 欧美日韩中文字幕一区| 91在线播放网站| 中文字幕一区不卡| 亚洲男人天堂av在线| www.色呦呦| 精品产国自在拍| 中文字幕在线一区二区三区| 欧美高清性粉嫩交| 成人在色线视频在线观看免费大全| 日本免费看黄色| 四虎永久免费影库二三区| 性欧美xxx极品另类| www色aa色aawww| 国产极品嫩模在线观看91精品| 青青青在线观看视频| 国产精品色噜噜| 亚洲熟女一区二区| 亚洲成人偷拍| 狠狠色狠狠色综合日日91app| 无码小电影在线观看网站免费| 麻豆一区二区三区在线观看| 亚洲美女视频在线| 一本一道久久久a久久久精品91| 黄视频在线观看www| 欧美国产91| 欧美在线三区| 日本欧美中文字幕| 国产亚洲精aa在线看| 成人性生交大片免费看视频在线| 亚洲午夜高清视频| 丁香一区二区三区| 午夜日韩在线观看| 国产日韩一区二区在线观看| 久久69精品久久久久久久电影好| 亚洲欧美另类在线| 久久久久免费精品国产| 国产最新网站| 日本人成精品视频在线| 插我舔内射18免费视频| 亚洲国产精品麻豆| 免费毛片小视频| 欧美一区二区三区综合| 日日碰狠狠躁久久躁婷婷| 成人av免费网站| 波多野结衣一区二区三区在线| 久久国产精品无码一级毛片| 欧美成人久久| 成人av在线电影| 一呦二呦三呦精品国产| 青青青爽久久午夜综合久久午夜| 亚洲在线视频播放| 视频一区国产| 亚洲欧美综合| 欧美禁忌电影| 中国china体内裑精亚洲片| 欧美日韩和欧美的一区二区| 国产精品天天干| 日韩久久久久久久久久久久| 欧美日韩二三区| 国产精品免费aⅴ片在线观看| 超碰人人人人人人| 国产精品久久久久91| 国产日韩成人内射视频| caoporn国产精品| 麻豆精品新av中文字幕| 68国产成人综合久久精品| 国产欧美日产一区| 日本高清不卡一区| 国产精品日韩一区二区免费视频| 国产成人免费视频app| 好吊一区二区三区| bl动漫在线观看| 亚洲美女综合网| 国产精品蜜臀在线观看| 一区二区免费在线观看| 国产一区二区三区四区五区美女| 日韩av不卡一区二区| 天天人人精品| 精品一区二区三孕妇视频| 亚洲精品视频一二三区| 中文字幕一区二区人妻电影丶| 97国产精品免费视频| 精品一区二区日韩| 中文字幕日韩欧美| 妖精一区二区三区精品视频| 欧美午夜精彩| 青青成人在线| 中文字幕av日韩精品| 免费又黄又爽又色的视频| 成人写真视频福利网| 亚洲高清色图| 精品福利久久久| 亚洲图片 自拍偷拍| 久久久久久婷| 99精品视频一区二区| 一区二区三区四区五区精品视频| 欧美日韩一区在线视频| 欧美精品久久一区二区三区| 国产偷拍一区二区| 一本加勒比hezyo黑人| 成人3d精品动漫精品一二三| 夜夜添无码一区二区三区| 一本一本久久| 久久伊人免费视频| 在线观看操人| а天堂中文在线资源| 图片区偷拍区小说区| 成人午夜激情片| 美女激情网站| 亚洲美女在线看| 国产精品中文字幕制服诱惑| 99re国产视频| 国产超级av在线| 欧美日韩亚洲色图| 亚洲第一精品夜夜躁人人躁| 麻豆久久久久久久久久| 五月婷婷六月激情| 亚洲人成网站77777在线观看| 国产一区二区三区四区五区六区| 日韩深夜视频| 国产成人在线视频观看| av在线首页| 国产在线美女| 色偷偷福利视频| 日本三级网站在线观看| 荫蒂被男人添免费视频| 国产精品久久久免费| 波多野结衣av在线| 无码人妻久久一区二区三区蜜桃| 国产成人小视频| 午夜精品一区二区三区四区| 亚洲免费网站在线观看| 欧美一级淫片| 欧美卡一卡二卡三| 2019中文亚洲字幕| 国产大片精品免费永久看nba| 麻豆高清免费国产一区| 永久免费黄色软件| 亚洲精品国产电影| 欧美三级中文字幕在线观看| 神马电影网我不卡| 精品国产乱码久久久久久免费| 亚洲精品国产无码| 日韩av色在线| 天天操 夜夜操| youjizz.com亚洲| 国产精品久久波多野结衣| 久久久久久久久丰满| 久久久无码人妻精品无码| 亚洲国内精品| 最近中文视频在线| 成人看的羞羞网站| 欧美精品导航| 一级黄色片视频| 欧美黄色免费在线观看| 成人毛片免费在线观看| 欧美视频在线免费| 国产视频一区二区三区在线观看|