青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

大龍的博客

常用鏈接

統(tǒng)計

最新評論

設計模式學習筆記(九)——Composite組合模式

      Composite組合模式主要是應對這樣的問題:一類具有“容器特征”的對象——即他們在充當對象的同時,又是其他對象的容器的情況。在編寫時我們常常會造成:客戶代碼過多地依賴于對象容器復雜的內部實現(xiàn),對象容器內部實現(xiàn)結構(而非抽象接口)的變化將引起客戶代碼的頻繁變化,帶來了代碼的維護性、擴展性的弊端。

       GoF《設計模式》中說到:將對象組合成樹形結構以表示“部分-整體”的層次結構。Composite模式使得客戶對單個對象和組合對象的使用具有一致性。

       Composite組合模式結構如下:

 


       說道這,我覺得有一個編程中常見的場景,就是對于樹的實現(xiàn),很符合這個模式。下面我就用這個例子作一下。

       首先,我們先分析對于一棵樹所包含的部分,樹干、樹枝、樹葉,其中樹干可以看成一個樹枝(就是粗了點)。那么我們就應該有兩種類實現(xiàn)Leaf(樹葉)和Limb(樹枝)。對于葉子節(jié)點和枝節(jié)點的不同在于枝節(jié)點有子樹,而葉子節(jié)點沒有子樹。為了使單個對象和組合對象的使用具有一致性,我可以將葉子節(jié)點想象成沒有子樹的枝節(jié)點。這樣我就可以得到一個抽象類,代碼如下:

       public abstract class AbstractClass

    {

        public string name;

        public ArrayList list;

        public abstract void Add(AbstractClass item);       //增加一個子節(jié)點

        public abstract void Remove(AbstractClass item);    //去掉一個子節(jié)點

        public abstract string Print();                     //打印當前節(jié)點

    }

       然后,我在對葉子節(jié)點和枝節(jié)點作不同的實現(xiàn):

       枝節(jié)點:

       public class Limb:AbstractClass

    {

        public Limb()

        {

            list = new ArrayList();

        }

 

        public override void Add(AbstractClass item)

        {

            list.Add(item);

        }

 

        public override void Remove(AbstractClass item)

        {

            if(list.Contains(item))

                list.Remove(item);

        }

        public override string Print()

        {

            Console.Write(name + "\n");

            if(list.Count != 0)

            {

                for(int i = 0;i<list.Count;i++)

                {

                    Console.Write("(Parent is " + name + ")");

                    ((AbstractClass)list[i]).Print();

                }

            }

            return name;

        }

 

    }

    葉子節(jié)點:

    public class Leaf:AbstractClass

    {

        public Leaf()

        {

            list = null;

        }

 

        public override void Add(AbstractClass item)

        {

 

        }

        public override void Remove(AbstractClass item)

        {

           

        }

        public override string Print()

        {

            Console.Write(name + ",");

            return this.name;

        }

    }

    對于葉子節(jié)點來說,不需要子節(jié)點,當然也就不需要添加和刪除子節(jié)點的方法。

    好,接下來,我們可以在客戶程序中組建一棵樹,來測試一下:

        static void Main(string[] args)

        {

            AbstractClass Tree = new Limb();

            GetTree(Tree);

            PrintTree(Tree);

            Console.Read();

        }

 

        public static void GetTree(AbstractClass Tree)

        {

            Tree.name = "1";

            AbstractClass leaf2 = new Leaf();

            leaf2.name = "2";

            Tree.Add(leaf2);

            AbstractClass limb3 = new Limb();

            limb3.name = "3";

            Tree.Add(limb3);

            AbstractClass leaf4 = new Leaf();

            leaf4.name = "4";

            limb3.Add(leaf4);

            AbstractClass leaf5 = new Leaf();

            leaf5.name = "5";

            limb3.Add(leaf5);

        }

 

        public static void PrintTree(AbstractClass Tree)

        {

            Tree.Print();

        }

    輸出結果如下:

1

(Parent is 1)2,(Parent is 1)3

(Parent is 3)4,(Parent is 3)5,

在組織這個樹時,的確能感覺到GoF《設計模式》中的那句話:單個對象和組合對象的使用具有一致性。當然也的確感覺到一點矛盾:對于葉子節(jié)點來說,不需要ArrayList和Add()Remove()應該不繼承才對,當然如果在代碼執(zhí)行性能可以達到要求的情況下,簡化一下編碼實現(xiàn)復雜度也是挺好的一件事。

最后在來說說Composite組合模式的幾個要點:

       1、Composite模式采用樹形結構來實現(xiàn)普遍存在的對象容器,從而將“一對多”的關系轉化為“一對一”的關系,使得客戶代碼可以一致的處理對象和對象容器,無需關心處理的是單個對象,還是組合的對象容器。

2、將“客戶代碼與復雜的對象容器結構”解耦是Composite模式的核心思想,解耦之后,客戶代碼將與純粹的對象接口——而非對象容器的復雜內部實現(xiàn)結構——發(fā)生依賴關系,從而更能“應對變化”。

3、Composite模式中,是將“Add和Remove的和對象容器相關的方法”定義在“表示抽象對象的Component類”中,還是將其定義在“表示對象容器的Composite類”中,是一個關乎“透明性”和“安全性”的兩難問題,需要仔細權衡結構,這又是必須付出的代價。

4、Composite模式在具體實現(xiàn)中,可以讓父對象中的字對象反向追溯:如果父對象有頻繁的遍歷需求,可使用緩存技巧來改善效率

posted on 2010-04-13 17:38 大龍 閱讀(207) 評論(0)  編輯 收藏 引用

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久在线免费观看| 免费在线看成人av| 国产亚洲一区二区三区在线播放| 久久夜色精品一区| 欧美韩国日本一区| 久久精品在线视频| 美女性感视频久久久| 欧美电影在线观看完整版| 欧美激情一区二区三区不卡| 最新国产乱人伦偷精品免费网站| 欧美国产综合| 在线亚洲美日韩| 久久精品一区二区三区不卡| 免费欧美日韩国产三级电影| 欧美精品v国产精品v日韩精品| 欧美系列精品| 国内成+人亚洲| 日韩一二三在线视频播| 欧美一区二区视频在线| 欧美大片在线观看| 亚洲午夜精品网| 欧美**字幕| 国产精品视频xxx| 亚洲人成网在线播放| 午夜精品一区二区三区在线| 欧美暴力喷水在线| 亚洲欧美区自拍先锋| 久久综合色影院| 国产酒店精品激情| 亚洲精品视频在线观看免费| 欧美影院一区| 亚洲三级电影全部在线观看高清| 欧美亚洲综合网| 欧美日韩在线第一页| 亚洲国产日韩一区| 久久久免费精品视频| 亚洲午夜精品久久久久久浪潮 | 国产精品久久激情| 最新日韩中文字幕| 久久综合国产精品台湾中文娱乐网| 99精品久久久| 欧美激情精品久久久六区热门| 国产视频一区免费看| 一区二区欧美日韩| 亚洲国产欧美一区| 久热精品视频在线| 在线不卡中文字幕| 久久久福利视频| 欧美一区二区三区的| 国产精品亚洲美女av网站| 亚洲天堂av在线免费观看| 亚洲黄色成人网| 久久亚洲一区| 伊人久久大香线| 久久最新视频| 欧美有码在线观看视频| 国产日韩精品一区| 久久福利精品| 一区二区三区四区五区视频| 亚洲第一天堂无码专区| 久久精品91| 香蕉久久一区二区不卡无毒影院| 国产精品久久久久久一区二区三区| 日韩一区二区免费看| 亚洲激情在线观看| 欧美国产精品日韩| 99国产精品久久久久老师| 亚洲电影免费在线| 欧美大秀在线观看| 日韩视频一区二区| 99视频在线观看一区三区| 欧美涩涩视频| 午夜精品影院在线观看| 午夜视频一区二区| 在线观看不卡| 91久久国产综合久久91精品网站| 欧美经典一区二区| 亚洲影视综合| 欧美自拍丝袜亚洲| 亚洲日韩成人| 亚洲午夜视频在线观看| 国产一区二区三区av电影| 久久在线免费视频| 欧美精品三区| 欧美综合激情网| 美女被久久久| 亚洲永久免费| 久久精品亚洲| 亚洲视频第一页| 久久国产一区二区三区| 亚洲精选在线| 欧美亚洲一区三区| 亚洲麻豆av| 欧美一区二区在线看| 亚洲精品欧美一区二区三区| 亚洲性线免费观看视频成熟| 永久免费精品影视网站| 亚洲精品免费在线| 韩国成人精品a∨在线观看| 亚洲国产第一页| 国产日韩精品在线| 亚洲欧洲在线一区| 国产最新精品精品你懂的| 亚洲人成在线影院| 极品少妇一区二区三区精品视频| 亚洲精品一线二线三线无人区| 国产午夜精品一区二区三区视频| 亚洲九九九在线观看| 狠狠久久亚洲欧美| 一片黄亚洲嫩模| 亚洲精品久久久久久久久| 亚洲在线视频一区| 中文精品视频| 牛牛国产精品| 久久综合中文色婷婷| 国产伦精品一区二区三区视频黑人 | 亚洲天堂激情| 国产精品剧情在线亚洲| 亚洲国产裸拍裸体视频在线观看乱了 | 亚洲精品一区二区三区蜜桃久| 亚洲欧美国产制服动漫| 一本久久青青| 欧美二区在线| 欧美成人精品激情在线观看| 国产区在线观看成人精品| 日韩视频久久| 中文国产成人精品| 欧美精品xxxxbbbb| 欧美激情中文字幕一区二区 | 欧美日韩中文另类| 欧美国产日韩a欧美在线观看| 激情一区二区三区| 久久久久www| 美女精品视频一区| 在线观看亚洲专区| 久久一二三国产| 美女脱光内衣内裤视频久久网站| 国产欧美日韩高清| 香蕉国产精品偷在线观看不卡 | 亚洲精选中文字幕| 亚洲午夜视频| 国产精品女主播在线观看| 亚洲午夜久久久久久久久电影院 | 亚洲国产成人一区| 久久综合九色综合欧美就去吻| 老鸭窝亚洲一区二区三区| 亚洲第一黄色| 欧美欧美全黄| 亚洲一区二区三区四区在线观看 | 一卡二卡3卡四卡高清精品视频| 国产精品99久久久久久久久久久久| 欧美日韩精品免费观看视一区二区| 亚洲免费观看高清在线观看 | 老司机一区二区| 亚洲第一福利社区| 99视频有精品| 国产精品男人爽免费视频1| 亚洲自拍电影| 久久免费视频在线| 亚洲日本在线观看| 欧美午夜视频网站| 久久高清一区| 亚洲国产欧美在线| 午夜精品国产更新| 黑人巨大精品欧美一区二区| 欧美大秀在线观看| 亚洲免费在线| 亚洲第一色中文字幕| 亚洲一区二区在线免费观看| 亚洲精品在线二区| 亚洲国产高潮在线观看| 欧美另类人妖| 欧美专区日韩专区| 日韩亚洲欧美一区| 久久在线观看视频| 一区二区三区高清在线观看| 国产美女精品视频免费观看| 久久亚洲精品中文字幕冲田杏梨| 日韩午夜黄色| 老司机aⅴ在线精品导航| 亚洲天堂男人| 亚洲国产精品福利| 国产欧美一区二区精品仙草咪| 欧美sm视频| 久久爱另类一区二区小说| 一区二区欧美日韩| 亚洲国产精品va在线观看黑人| 欧美一区二区三区在线| 一区二区三区日韩欧美| 亚洲国产成人久久| 国语自产精品视频在线看一大j8 | 亚洲第一黄色| 国产精品综合久久久| 欧美国产亚洲视频| 久久精品亚洲一区二区| 亚洲在线观看| 亚洲一区国产精品| 一区二区av| 99xxxx成人网| 亚洲日本aⅴ片在线观看香蕉|