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

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

深入剖析設(shè)計(jì)模式中的組合模式應(yīng)用及在C++中的實(shí)現(xiàn)

2020-05-23 14:07:35
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
這篇文章主要介紹了設(shè)計(jì)模式中的組合模式應(yīng)用及在C++中的實(shí)現(xiàn),組合模式可以清晰地反映出遞歸構(gòu)建樹(shù)狀的組合結(jié)構(gòu),需要的朋友可以參考下
 

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

模式圖:

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

適用場(chǎng)景:

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

舉例:

namespace FactoryMethod_DesignPattern{  using System;  using System.Collections;  abstract class Component   {    protected string strName;    public Component(string name)    {      strName = name;    }    abstract public void Add(Component c);      public abstract void DumpContents();        // other operations for delete, get, etc.  }  class Composite : Component  {    private ArrayList ComponentList = new ArrayList();        public Composite(string s) : base(s) {}    override public void Add(Component c)    {      ComponentList.Add(c);    }    public override void DumpContents()    {      // First dump the name of this composite node      Console.WriteLine("Node: {0}", strName);      // Then loop through children, and get then to dump their contents      foreach (Component c in ComponentList)      {        c.DumpContents();      }    }  }  class Leaf : Component  {    public Leaf(string s) : base(s) {}    override public void Add(Component c)    {      Console.WriteLine("Cannot add to a leaf");    }    public override void DumpContents()    {      Console.WriteLine("Node: {0}", strName);    }  }  /// <summary>  ///  Summary description for Client.  /// </summary>  public class Client  {    Component SetupTree()    {      // here we have to create a tree structure,       // consisting of composites and leafs.         Composite root = new Composite("root-composite");      Composite parentcomposite;      Composite composite;      Leaf leaf;      parentcomposite = root;      composite = new Composite("first level - first sibling - composite");      parentcomposite.Add(composite);      leaf = new Leaf("first level - second sibling - leaf");      parentcomposite.Add(leaf);      parentcomposite = composite;       composite = new Composite("second level - first sibling - composite");      parentcomposite.Add(composite);      composite = new Composite("second level - second sibling - composite");      parentcomposite.Add(composite);      // we will leaf the second level - first sibling empty, and start       // populating the second level - second sibling       parentcomposite = composite;       leaf = new Leaf("third level - first sibling - leaf");      parentcomposite.Add(leaf);            leaf = new Leaf("third level - second sibling - leaf");      parentcomposite.Add(leaf);      composite = new Composite("third level - third sibling - composite");      parentcomposite.Add(composite);      return root;    }    public static int Main(string[] args)    {          Component component;      Client c = new Client();      component = c.SetupTree();      component.DumpContents();      return 0;    }  }}


可以看出,Composite類(lèi)型的對(duì)象可以包含其它Component類(lèi)型的對(duì)象。換而言之,Composite類(lèi)型對(duì)象可以含有其它的樹(shù)枝(Composite)類(lèi)型或樹(shù)葉(Leaf)類(lèi)型的對(duì)象。

合成模式的實(shí)現(xiàn)根據(jù)所實(shí)現(xiàn)接口的區(qū)別分為兩種形式,分別稱為安全模式和透明模式。合成模式可以不提供父對(duì)象的管理方法,但合成模式必須在合適的地方提供子對(duì)象的管理方法(諸如:add、remove、getChild等)。

透明方式

 

作為第一種選擇,在Component里面聲明所有的用來(lái)管理子類(lèi)對(duì)象的方法,包括add()、remove(),以及getChild()方法。這樣做的好處是所有的構(gòu)件類(lèi)都有相同的接口。在客戶端看來(lái),樹(shù)葉類(lèi)對(duì)象與合成類(lèi)對(duì)象的區(qū)別起碼在接口層次上消失了,客戶端可以同等同的對(duì)待所有的對(duì)象。這就是透明形式的合成模式。

這個(gè)選擇的缺點(diǎn)是不夠安全,因?yàn)闃?shù)葉類(lèi)對(duì)象和合成類(lèi)對(duì)象在本質(zhì)上是有區(qū)別的。樹(shù)葉類(lèi)對(duì)象不可能有下一個(gè)層次的對(duì)象,因此add()、remove()以及getChild()方法沒(méi)有意義,是在編譯時(shí)期不會(huì)出錯(cuò),而只會(huì)在運(yùn)行時(shí)期才會(huì)出錯(cuò)。

安全方式

第二種選擇是在Composite類(lèi)里面聲明所有的用來(lái)管理子類(lèi)對(duì)象的方法。這樣的做法是安全的做法,因?yàn)闃?shù)葉類(lèi)型的對(duì)象根本就沒(méi)有管理子類(lèi)對(duì)象的方法,因此,如果客戶端對(duì)樹(shù)葉類(lèi)對(duì)象使用這些方法時(shí),程序會(huì)在編譯時(shí)期出錯(cuò)。

這個(gè)選擇的缺點(diǎn)是不夠透明,因?yàn)闃?shù)葉類(lèi)和合成類(lèi)將具有不同的接口。

這兩個(gè)形式各有優(yōu)缺點(diǎn),需要根據(jù)軟件的具體情況做出取舍決定。

安全式的合成模式實(shí)現(xiàn): 只有composite有Add ,remove,delete等方法.

以下示例性代碼演示了安全式的合成模式代碼:

// Composite pattern -- Structural example using System;using System.Text;using System.Collections;// "Component"abstract class Component{ // Fields protected string name; // Constructors public Component( string name ) {  this.name = name; } // Operation public abstract void Display( int depth );}// "Composite"class Composite : Component{ // Fields private ArrayList children = new ArrayList(); // Constructors public Composite( string name ) : base( name ) {} // Methods public void Add( Component component ) {  children.Add( component ); } public void Remove( Component component ) {  children.Remove( component ); } public override void Display( int depth ) {  Console.WriteLine( new String( '-', depth ) + name );  // Display each of the node's children  foreach( Component component in children )   component.Display( depth + 2 ); }}// "Leaf"class Leaf : Component{ // Constructors public Leaf( string name ) : base( name ) {} // Methods public override void Display( int depth ) {  Console.WriteLine( new String( '-', depth ) + name ); }}/// <summary>/// Client test/// </summary>public class Client{ public static void Main( string[] args ) {  // Create a tree structure  Composite root = new Composite( "root" );  root.Add( new Leaf( "Leaf A" ));  root.Add( new Leaf( "Leaf B" ));  Composite comp = new Composite( "Composite X" );  comp.Add( new Leaf( "Leaf XA" ) );  comp.Add( new Leaf( "Leaf XB" ) );  root.Add( comp );  root.Add( new Leaf( "Leaf C" ));  // Add and remove a leaf  Leaf l = new Leaf( "Leaf D" );  root.Add( l );  root.Remove( l );  // Recursively display nodes  root.Display( 1 ); }}

 透明式的合成模式實(shí)現(xiàn): 每個(gè)里都有add,remove等修改方法.
以下示例性代碼演示了安全式的合成模式代碼:

// Composite pattern -- Structural example using System;using System.Text;using System.Collections;// "Component"abstract class Component{ // Fields protected string name; // Constructors public Component( string name ) { this.name = name; } // Methods abstract public void Add(Component c); abstract public void Remove( Component c ); abstract public void Display( int depth );}// "Composite"class Composite : Component{ // Fields private ArrayList children = new ArrayList(); // Constructors public Composite( string name ) : base( name ) {} // Methods public override void Add( Component component ) { children.Add( component ); }  public override void Remove( Component component ) { children.Remove( component ); }  public override void Display( int depth ) {   Console.WriteLine( new String( '-', depth ) + name );  // Display each of the node's children  foreach( Component component in children )   component.Display( depth + 2 ); }}// "Leaf"class Leaf : Component{ // Constructors public Leaf( string name ) : base( name ) {} // Methods public override void Add( Component c ) { Console.WriteLine("Cannot add to a leaf"); } public override void Remove( Component c ) { Console.WriteLine("Cannot remove from a leaf"); } public override void Display( int depth ) { Console.WriteLine( new String( '-', depth ) + name ); }}/// <summary>/// Client test/// </summary>public class Client{ public static void Main( string[] args ) {  // Create a tree structure  Composite root = new Composite( "root" );  root.Add( new Leaf( "Leaf A" ));  root.Add( new Leaf( "Leaf B" ));  Composite comp = new Composite( "Composite X" );  comp.Add( new Leaf( "Leaf XA" ) );  comp.Add( new Leaf( "Leaf XB" ) );  root.Add( comp );  root.Add( new Leaf( "Leaf C" ));  // Add and remove a leaf  Leaf l = new Leaf( "Leaf D" );  root.Add( l );  root.Remove( l );  // Recursively display nodes  root.Display( 1 ); }}

實(shí)例

再看看一個(gè)完整些的例子:

#include <iostream> #include <string> #include <list> using namespace std;  class Component { protected:   string name; public:   Component(string name)     :name(name)   {  }   virtual void AddComponent(Component *component) {  }   virtual void RemoveComponent(Component *component) {  }   virtual void GetChild(int depth)  { } };  class Leaf: public Component { public:   Leaf(string name)     :Component(name)   {  }   void AddComponent(Component *component)   {     cout<<"Leaf can't add component"<<endl;   }   void RemoveComponent(Component *component)   {     cout<<"Leaf can't remove component"<<endl;   }   void GetChild(int depth)   {     string _tmpstring(depth, '-');     cout<<_tmpstring<<name<<endl;   } };  class Composite:public Component { private:   list<Component*> _componets;  public:   Composite(string name)     :Component(name)   { }   void AddComponent(Component *component)   {     _componets.push_back(component);   }   void RemoveComponent(Component *component)   {     _componets.remove(component);   }   void GetChild(int depth)   {     string tmpstring (depth, '-');     cout<<tmpstring<<name<<endl;     list<Component*>::iterator iter = _componets.begin();     for(; iter != _componets.end(); iter++)     {       (*iter)->GetChild(depth + 2);     }   } };  int main() {   Composite *root = new Composite("root");   Leaf *leaf1 = new Leaf("leaf1");   Leaf *leaf2 = new Leaf("leaf2");   root->AddComponent(leaf1);   root->AddComponent(leaf2);    Composite *lay2 = new Composite("layer2");   Leaf *leaf4 = new Leaf("leaf4");   lay2->AddComponent(leaf4);    Composite *lay1 = new Composite("layer1");   Leaf *leaf3 = new Leaf("leaf3");   lay1->AddComponent(leaf3);   lay1->AddComponent(lay2);    root->AddComponent(lay1);    root->GetChild(1);   cout<<endl;   lay1->GetChild(1);   cout<<endl;   lay2->GetChild(1);    delete root;   delete lay1;   delete lay2;   delete leaf1;   delete leaf2;   delete leaf3;   delete leaf4;   system("pause");   return 0; } 

輸出:

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



發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
国产精品久久久久久免费免熟| 精品99又大又爽又硬少妇毛片| 国产精品一区二区三区网站| 欧美激情一级精品国产| 亚洲成人五区| 亚洲色图在线播放| 看一级黄色录像| 在线中文字幕电影| 国产精品手机在线播放| 欧美性生交大片免网| 自拍偷自拍亚洲精品被多人伦好爽| 五月国产精品| 成人av在线不卡| 成人在线国产精品| 日韩视频一区二区三区在线播放| 欧美成人激情视频免费观看| 少妇激情av一区二区| 黄色国产在线观看| 亚洲国产成人一区二区| 国产美女裸体无遮挡免费视频| 国产日韩欧美一区在线| 日本韩国一区二区三区| 久久精品国产亚洲blacked| 亚洲精品亚洲人成人网在线播放| 亚洲五码在线| 欧美日韩小视频| 欧美一区精品| 免费永久视频| 在线亚洲天堂| 精品一区二区三区自拍图片区| 黄网免费视频| 忘忧草在线影院两性视频| 神马国产精品影院av| 亚洲综合最新在线| 很黄很污的视频网站| 51精产品一区一区三区| 日本在线免费播放| 亚洲性生活网站| 中文字幕在线第一页| 激情av在线播放| 色综合天天综合网中文字幕| 国产熟妇久久777777| 天天色综合久久| √…a在线天堂一区| 欧美视频精品| 国产一级免费观看| 91精品国产综合久久久久久漫画| 四虎影视成人精品国库在线观看| 石原莉奈一区二区三区高清在线| 精品一区二区三区的国产在线观看| 黄页网站视频在线观看| 视频午夜在线| 免费看久久久| 99国产精品一区二区| 欧美激情a∨在线视频播放| 欧美在线激情视频| 国产精品美女久久久久高潮| 欧美在线观看www| 一个色综合av| 国产精品久久久久久久小唯西川| 久久国产精品99国产| 亚洲wwwww| 亚洲精品国产a久久久久久| 国产精品美女久久久久久免费| 黄网免费视频| 精品999网站| 欧美一级搡bbbb搡bbbb| 亚洲无人区码一码二码三码| 午夜成在线www| 美女扒开腿让男人桶爽久久动漫| 欧美高清性hdvideosex| 国模吧精品视频| 另类在线视频| 涩涩网站在线观看| 91在线你懂的| 亚洲 激情 在线| 色免费在线观看| 欧美亚洲色综久久精品国产| 亚洲精品白浆| 日本亚洲欧美美色| 波多野结衣久久精品| 欧美色电影在线| 天天干天天舔| 黄色动漫网站| 国产三级国产精品国产国在线观看| 肉色丝袜一区二区| 亚洲欧美成aⅴ人在线观看| 亚洲国产精品第一页| 岛国视频午夜一区免费在线观看| 欧美国产日本韩| 亚洲最大免费| 国产免费成人在线| xxww在线观看| 欧美一级片免费在线| 五月天婷亚洲天综合网精品偷| jizzjizzjizzjizz| 亚洲一区三区在线观看| 中文在线天堂库| 2020av在线| www.女人的天堂.com| 黄网站欧美内射| av电影免费在线看| 无码人妻熟妇av又粗又大| 久久这里只有精品9| 男人揉女人奶房视频60分| 成年人免费在线观看网站| 日韩色级片先锋影音| 亚洲愉拍自拍另类高清精品| 国产精选在线观看| 青青久精品观看视频最新| 蜜桃精品噜噜噜成人av| 一本色道久久综合亚洲精品图片| 欧美午夜精品一区二区| 宅男噜噜噜66国产精品免费| 一级黄色片免费看| 日韩午夜高潮| 欧美一区激情视频在线观看| 日韩精品av一区二区三区| 国产精品一卡二卡| 99精品视频在线观看免费| 国产精品毛片一区二区在线看| 久久久久久久久久久久久久国产| 黄页免费欧美| 一本色道久久精品| 99ri日韩精品视频| 91精品啪在线观看国产81旧版| 国产精品久久久久av蜜臀| 国产在线观看黄色| 91嫩草国产丨精品入口麻豆| 91视频免费在线| 在线观看wwwxxxx| 污污视频网站在线免费观看| 成人免费视频网站在线看| 欧美探花视频资源| 国产真乱mangent| 老司机aⅴ在线精品导航| 精品国产一区二区三区小蝌蚪| 亚洲AV无码国产成人久久| 被男人吃奶添下面好舒服动态图| 久久av免费一区| 欧美日韩性生活视频| 影音先锋5566中文源资源| 欧美一区二区三区四区夜夜大片| 久久美女艺术照精彩视频福利播放| 国产区美女在线| 日本中文字幕电影在线观看| 欧美自拍偷拍一区二区| 亚洲免费av高清| 国产精品久线观看视频| 国产精品538一区二区在线| 懂色av蜜臀av粉嫩av喷吹| 亚洲精品国产动漫| 欧美黑人一区| 免费在线观看的毛片| 亚洲欧美网站在线观看| 亚洲第一精品区| 久久久久久久欧美精品| av免费在线电影| 国产精品免费福利| 欧美色网在线| 人人做人人爽| 天堂社区在线视频| 国产精欧美一区二区三区白种人| 欧美一区二区视频17c| 国产精品自产拍| 欧洲生活片亚洲生活在线观看| a视频在线看| 久久精品欧美一区二区三区麻豆| av网页在线观看| 欧洲一区二区三区免费视频| 天天干天天玩天天操| av毛片在线播放| 久久bbxx| 中文字幕va一区二区三区| 免费观看美女裸体网站| 性感美女一区二区在线观看| 日韩av中文| av在线观看地址| 夫妻性生活毛片| 欧美黄在线观看| 欧美1区2区视频| 中文字幕va一区二区三区| 免费在线观看的av| 97人妻精品一区二区三区软件| 一本一道久久a久久| 国产精品电影一区二区| 天天干夜夜干| 色播色播色播色播色播在线| 高清不卡av| 久久久精品视频在线观看| 亚洲天堂免费| 男人的天堂视频网站| caoporm免费视频在线| 日韩欧美第二区在线观看| 91久久夜色精品国产网站| 女人黄色一级片| 在线观看中文字幕码| 日韩美女一级片| 污视频在线观看网站| 亚洲av无码一区二区三区观看| 精品一区二区中文字幕| 午夜av在线免费观看| 日日碰狠狠添天天爽| 在线亚洲人成电影网站色www| 欧美一区二区激情| 亚洲三级在线看| 成人性生活免费看| 日韩一级大片在线| 欧美色欧美亚洲另类七区| 996久久国产精品线观看| 免费99精品国产自在在线| 国产欧美一级| 国产成人午夜高潮毛片| 亚洲精品一线二线三线无人区| 26uuu色噜噜精品一区| 午夜激情一区二区| 最近中文字幕mv免费高清视频8| 精品一区二区三区在线视频| 国产一区二区三区国产| www免费视频观看在线| 欧美熟妇精品黑人巨大一二三区| 亚洲在线视频播放| 激情综合网五月天| 亚洲电影在线看| 国产高清成人在线| 91成人性视频| www.先锋影音av| 亚洲电影二区| 精品国产一区探花在线观看| 亚洲九九视频| 中国一级片黄色一级片黄| 五月天久久久久久| 999国产精品亚洲77777| 日本一区二区不卡高清更新| www.99在线| 色多多国产成人永久免费网站| 91九色单男在线观看| 羞羞视频在线观看一区二区| 成人久久精品人妻一区二区三区| 久久久久久久久影视| 亚洲欧美日韩天堂| 国产91精品免费| 菠萝蜜一区二区| 久久人人九九| 国产第一页浮力| 欧美日韩视频在线一区二区观看视频| 日本一区二区视频在线观看| 亚洲色图16p| 国产精品扒开腿做爽爽爽视频| 天堂аⅴ在线地址8| 狠狠色丁香婷综合久久| 久久国产在线观看| youjizz.com亚洲| 亚洲第一页在线播放| 无码人妻一区二区三区免费n鬼沢| 欧美一级电影网站| 91麻豆精品国产91久久久平台| 高清美女视频一区| 亚洲成人福利视频| 久久网站免费观看| 日本一区二区不卡高清更新| 国产精品久久久久国产a级| 成人激情诱惑| 在线亚洲人成电影网站色www| 亚洲精品**不卡在线播he| 欧美黑人一级爽快片淫片高清| 久久精品亚洲麻豆av一区二区| 97成人超碰| av毛片在线免费观看| 亚洲麻豆国产自偷在线| 天堂视频免费看| 亚洲成人av在线播放| frxxee中国xxx麻豆hd| 亚洲成av人片在线观看无| jizzjizz19| 激情五月俺来也| 影音先锋男人每日资源站| 在线播放三级网站| 亚洲国产精品激情在线观看| 国产原创精品| 久久久五月天| 欧美日韩色综合| 久久亚洲综合| 免费观看美女裸体网站| 欧美在线视频导航| 亚洲制服少妇| 一本一生久久a久久精品综合蜜| 日本高清免费电影一区| 国产精品入口夜色视频大尺度| 欧美美乳视频| 欧美国产一区视频在线观看| 少妇一级淫片免费看| 男人天堂网在线| 91l九色lporny| 亚洲国产精品嫩草影院久久av| 中文字幕免费看| 欧美成年网站| 国产精品一区二区久激情瑜伽| 日韩欧美2区| 中文字幕人成高清视频| 久久er热在这里只有精品66| 隔壁老王国产在线精品| 麻豆导航在线观看| 51国偷自产一区二区三区的来源| 乱插在线www| 日本少妇bbwbbw精品| 成人做爰视频网站| 99热播精品免费| 老司机av网站| 亚洲免费视频二区| 另类天堂av| 日韩一卡二卡三卡国产欧美| 国产成人欧美在线观看| 蜜桃91精品入口| 亚洲精品国产一区二区三区| 国内精品久久久久久久久久| 日韩欧美高清视频| 欧美日韩四区| 久久久久久综合网天天| 日本中文字幕久久看| 国产色视频一区| 国产视频一区在线播放| 777电影在线观看| 国产精品稀缺呦系列在线| 超碰超碰人人人人精品| 欧美精品欧美极品欧美激情| 日韩成人av在线| 日韩精品中文字幕一区二区|