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

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

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

2020-05-23 14:21:15
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了C++設計模式之組合模式,本文講解什么是組合模式、組合模式的優點、組合模式實例等內容,需要的朋友可以參考下
 
 

問題描述

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

上圖,是一個公司的組織結構圖,總部下面有多個子公司,同時總部也有各個部門,子公司下面有多個部門。如果對這樣的公司開發一個OA系統,作為程序員的你,如何設計這個OA系統呢?先不說如何設計實現,接著往下看,看完了下面的內容,再回過頭來想怎么設計這樣的OA系統。

什么是組合模式?

在GOF的《設計模式:可復用面向對象軟件的基礎》一書中對組合模式是這樣說的:將對象組合成樹形結構以表示“部分-整體”的層次結構。組合(Composite)模式使得用戶對單個對象和組合對象的使用具有一致性。

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

我們這樣來簡單的理解組合模式,組合模式就是把一些現有的對象或者元素,經過組合后組成新的對象,新的對象提供內部方法,可以讓我們很方便的完成這些元素或者內部對象的訪問和操作。我們也可以把組合對象理解成一個容器,容器提供各種訪問其內部對象或者元素的API,我們只需要使用這些方法就可以操作它了。

UML類圖

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

Component:

1.為組合中的對象聲明接口;
2.在適當的情況下,實現所有類共有接口的缺省行為;
3.聲明一個接口用于訪問和管理Component的子組件。

Leaf:

1.在組合中表示葉節點對象,葉節點沒有子節點;
2.在組合中定義葉節點的行為。

Composite:

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

Client:

3.通過Component接口操作組合部件的對象。

代碼實現

 

復制代碼代碼如下:

/*
** 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;
// 抽象的部件類描述將來所有部件共有的行為
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();
     // 公司不景氣,需要關閉上海質量監督部門
     pSubNodeSh->Remove(pSubNodeShZb);
     if (pNode != NULL)
     {
          delete pNode;
          pNode = NULL;
     }
     return 0;
}

 

實現要點

1.Composite的關鍵之一在于一個抽象類,它既可以代表Leaf,又可以代表Composite;所以在實際實現時,應該最大化Component接口,Component類應為Leaf和Composite類盡可能多定義一些公共操作。Component類通常為這些操作提供缺省的實現,而Leaf和Composite子類可以對它們進行重定義;

2.Component是否應該實現一個Component列表,在上面的代碼中,我是在Composite中維護的列表,由于在Leaf中,不可能存在子Composite,所以在Composite中維護了一個Component列表,這樣就減少了內存的浪費;

3.內存的釋放;由于存在樹形結構,當父節點都被銷毀時,所有的子節點也必須被銷毀,所以,我是在析構函數中對維護的Component列表進行統一銷毀,這樣就可以免去客戶端頻繁銷毀子節點的困擾;

4.由于在Component接口提供了最大化的接口定義,導致一些操作對于Leaf節點來說并不適用,比如:Leaf節點并不能進行Add和Remove操作,由于Composite模式屏蔽了部分與整體的區別,為了防止客戶對Leaf進行非法的Add和Remove操作,所以,在實際開發過程中,進行Add和Remove操作時,需要進行對應的判斷,判斷當前節點是否為Composite。

組合模式的優點

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

使用場景

1.你想表示對象的部分-整體層次結構;
2.希望用戶忽略組合對象與單個對象的不同,用戶將統一地使用組合結構中的所有對象。

引用大話設計模式的片段:“當發現需求中是體現部分與整體層次結構時,以及你希望用戶可以忽略組合對象與單個對象的不同,統一地使用組合結構中的所有對象時,就應該考慮組合模式了。”

總結

通過上面的簡單講解,我們知道了,組合模式意圖是通過整體與局部之間的關系,通過樹形結構的形式進行組織復雜對象,屏蔽對象內部的細節,對外展現統一的方式來操作對象,是我們處理更復雜對象的一個手段和方式?,F在再結合上面的代碼,想想文章開頭提出的公司OA系統如何進行設計。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
在线观看欧美日韩国产| 欧美另类69精品久久久久9999| 欧美成人在线免费视频| 狠狠色香婷婷久久亚洲精品| 国产成人av在线播放| 国产精品免费看久久久香蕉| 亚洲欧美日韩网| 亚洲男人的天堂网站| 91免费国产网站| 欧美肥臀大乳一区二区免费视频| 中文字幕日韩av综合精品| 成人两性免费视频| 日本三级韩国三级久久| 国产91精品视频在线观看| 久久视频在线播放| 538国产精品视频一区二区| 91av福利视频| 欧美整片在线观看| 国产欧美日韩中文字幕在线| 欧美性猛交xxxx乱大交蜜桃| 国产热re99久久6国产精品| 欧美一级在线播放| 久99久在线视频| 欧美做受高潮电影o| 中文字幕九色91在线| 日韩精品视频在线免费观看| 国产区亚洲区欧美区| 欧美高清性猛交| 日韩欧美国产中文字幕| 欧美日韩免费区域视频在线观看| 久久久久久久久久久免费精品| 日韩成人av在线播放| 国产z一区二区三区| 日韩美女视频中文字幕| 伊人av综合网| 北条麻妃一区二区三区中文字幕| 久久91亚洲人成电影网站| 欧美午夜精品在线| 国产一区二区在线播放| 欧美另类老女人| 久久韩国免费视频| 亚洲香蕉成人av网站在线观看| 欧美成aaa人片在线观看蜜臀| 国产国语刺激对白av不卡| 性视频1819p久久| 精品国产1区2区| 中文字幕国产日韩| 国产自产女人91一区在线观看| 久久琪琪电影院| 狠狠色噜噜狠狠狠狠97| 国产精品久久久久久久久| 成人黄色av网站| 欧美在线视频网| 亚洲精品大尺度| 亚洲天堂男人天堂| 日韩大片免费观看视频播放| 欧美性视频在线| 久久久久久久国产精品| 国产精品观看在线亚洲人成网| 欧美成人在线免费视频| 成人黄色av免费在线观看| 欧美做爰性生交视频| 欧美色另类天堂2015| 中文字幕精品在线视频| 91色视频在线导航| 亚洲日韩欧美视频| 中文字幕不卡在线视频极品| 青青草原一区二区| 91精品国产综合久久香蕉最新版| 久久伊人精品一区二区三区| 日本欧美在线视频| 18久久久久久| 欧美日韩激情小视频| 成人免费网视频| 最近2019中文字幕在线高清| 中文在线不卡视频| 欧美激情乱人伦| 国产成人鲁鲁免费视频a| 一夜七次郎国产精品亚洲| 亚洲精品久久久久中文字幕欢迎你| 亚洲欧美国产va在线影院| 国产精品美女网站| 92看片淫黄大片欧美看国产片| 久久久久久久久网站| 欧美极品少妇xxxxⅹ免费视频| 欧美视频免费在线| 91精品免费视频| 日韩欧美在线第一页| 色妞一区二区三区| 菠萝蜜影院一区二区免费| 欧美一区二区.| 97婷婷涩涩精品一区| 欧美日韩黄色大片| 国产在线久久久| 最近2019好看的中文字幕免费| 国产日韩视频在线观看| 亚洲午夜性刺激影院| 热久久视久久精品18亚洲精品| 欧美午夜丰满在线18影院| 亚洲视频在线播放| 91高清视频在线免费观看| 中文在线资源观看视频网站免费不卡| 欧美国产极速在线| 国产日韩精品综合网站| 成人h片在线播放免费网站| 国产欧美一区二区三区久久人妖| 欧美日韩国产页| 日韩中文字幕免费看| 国产99久久精品一区二区永久免费| 午夜精品久久久久久久久久久久| 91日本视频在线| 日韩精品视频免费在线观看| 色婷婷**av毛片一区| 国产在线视频2019最新视频| 久久天天躁狠狠躁夜夜av| 亚洲欧美国产一区二区三区| 久久精品成人动漫| 一区二区三区美女xx视频| 欧美一级片一区| 97在线免费视频| 日韩高清av在线| 精品国产欧美一区二区三区成人| 欧美激情中文字幕在线| 国产午夜精品视频免费不卡69堂| 国产成人精品国内自产拍免费看| 影音先锋欧美在线资源| 日韩中文综合网| 亚洲精品美女在线观看| 视频在线一区二区| 亚洲性生活视频在线观看| 久久琪琪电影院| 国产精品视频一区二区高潮| 国产91精品黑色丝袜高跟鞋| 在线观看日韩视频| 欧美成人手机在线| 一本一本久久a久久精品牛牛影视| 在线观看国产精品淫| 国产日韩中文字幕| 91在线观看欧美日韩| 国产精品久久久久久影视| 97av在线影院| 亚洲精品福利免费在线观看| 日韩中文在线不卡| 日韩网站在线观看| 97精品视频在线| 欧美一级在线播放| 亚洲精品日产aⅴ| 久久精品视频一| 国产亚洲精品久久久久久777| 色噜噜狠狠狠综合曰曰曰| 91wwwcom在线观看| 久久偷看各类女兵18女厕嘘嘘| 91精品久久久久久久久久| 夜夜躁日日躁狠狠久久88av| 中文字幕不卡av| 中文字幕亚洲色图| 久久精品福利视频| 久久69精品久久久久久久电影好| 欧美一区二区色| 国产精品美女免费视频| 欧美日韩国产二区| 亚洲第一精品久久忘忧草社区| 一区二区亚洲精品国产| 97在线免费观看视频|