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

大龍的博客

常用鏈接

統計

最新評論

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

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

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

       Composite組合模式結構如下:

 


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

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

       public abstract class AbstractClass

    {

        public string name;

        public ArrayList list;

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

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

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

    }

       然后,我在對葉子節點和枝節點作不同的實現:

       枝節點:

       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;

        }

 

    }

    葉子節點:

    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;

        }

    }

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

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

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

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

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

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

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

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

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


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            99热这里只有成人精品国产| 亚洲四色影视在线观看| 久久男人资源视频| 亚洲国产精品99久久久久久久久| 久久免费一区| 美女露胸一区二区三区| 一区二区三区精密机械公司| 日韩视频二区| 国产酒店精品激情| 裸体歌舞表演一区二区| 欧美成人中文字幕在线| 一区二区三区视频在线| 亚洲欧美一区二区三区极速播放| 国产在线乱码一区二区三区| 欧美大片第1页| 欧美日韩国语| 久久久久.com| 欧美精品一区三区在线观看| 亚洲免费在线观看视频| 久久精品视频在线| 夜夜爽99久久国产综合精品女不卡| 99国产精品私拍| 国产亚洲精品成人av久久ww| 亚洲国产欧美日韩另类综合| 欧美午夜片在线免费观看| 欧美在线视频导航| 欧美高清你懂得| 香蕉久久国产| 欧美激情一区二区在线 | 久久天天综合| 99国产精品久久| 欧美一区二区在线免费播放| 亚洲精品久久久一区二区三区| 亚洲性感美女99在线| 亚洲国产精品一区二区www| 这里只有视频精品| 亚洲国产99精品国自产| 亚洲综合色激情五月| 亚洲精品久久久久久久久| 亚洲欧美中文另类| 亚洲视频欧美在线| 免费欧美在线视频| 久久久久久网址| 国产精品裸体一区二区三区| 亚洲区国产区| 亚洲国产cao| 久久9热精品视频| 欧美一区二区三区免费观看视频| 欧美黄色一级视频| 欧美成在线观看| 永久域名在线精品| 亚欧美中日韩视频| 欧美在线不卡| 国产精品一区二区你懂得| 99re国产精品| 亚洲五月婷婷| 欧美三级在线视频| 亚洲另类在线视频| 日韩视频在线一区二区| 美女主播一区| 欧美电影免费观看高清完整版| 韩国精品在线观看| 欧美一区国产在线| 久久亚洲精品一区| 国内精品久久久久伊人av| 亚洲欧美日韩人成在线播放| 欧美一区二区三区男人的天堂| 欧美香蕉大胸在线视频观看| 99热在这里有精品免费| 一本久久综合| 欧美偷拍另类| 一区二区三区欧美日韩| 亚洲视频专区在线| 国产精品swag| 99精品国产99久久久久久福利| 亚洲素人在线| 国产精品一区视频| 午夜在线成人av| 欧美在线播放| 在线欧美日韩国产| 欧美电影在线观看完整版| 91久久精品www人人做人人爽 | 国产精品自拍网站| 欧美一区二区三区在线看| 久久夜精品va视频免费观看| 国产日韩专区在线| 久久成人资源| 亚洲国产精品成人| 在线视频欧美一区| 国产亚洲福利社区一区| 久久视频在线看| 亚洲精品国产精品乱码不99按摩| 夜夜嗨av一区二区三区免费区| 欧美午夜视频| 久久噜噜亚洲综合| 一区二区三区国产精华| 久久国产主播精品| 亚洲日本成人网| 国产精品免费看| 麻豆av一区二区三区| 日韩一级免费| 欧美xx69| 亚洲欧美国产不卡| 亚洲第一精品影视| 国产精品久久久久aaaa樱花| 久久久久国产精品麻豆ai换脸| 亚洲精品一区在线观看| 久久久久高清| 亚洲综合色自拍一区| 精品91视频| 国产精品视频网址| 欧美aⅴ99久久黑人专区| 亚洲女女女同性video| 美女视频黄 久久| 亚洲欧美在线磁力| 亚洲精选91| 亚洲大片在线| 国产午夜精品久久久| 欧美日韩中字| 欧美成人免费小视频| 欧美在线视频日韩| 亚洲欧美99| 99精品视频免费| 亚洲国产岛国毛片在线| 久久久久久久综合色一本| 亚洲欧美日产图| 亚洲无吗在线| 日韩一区二区福利| 亚洲欧洲精品一区二区三区不卡| 国产三级欧美三级| 国产精品免费电影| 国产精品久久国产精品99gif | 国产精品腿扒开做爽爽爽挤奶网站| 欧美激情综合亚洲一二区| 久久乐国产精品| 久久久亚洲综合| 久久av老司机精品网站导航| 亚洲综合成人在线| 亚洲一二三四久久| 一区二区三区产品免费精品久久75 | 欧美黑人在线观看| 另类尿喷潮videofree| 久久av在线看| 久久精品国产一区二区三区| 午夜精品免费在线| 欧美一区二区网站| 久久精品国产77777蜜臀| 久久国产精品99精品国产| 久久精品国产免费观看| 久久精品女人的天堂av| 久久久999精品免费| 久久综合色天天久久综合图片| 久久久蜜桃精品| 欧美jizz19hd性欧美| 欧美激情2020午夜免费观看| 欧美日韩精品欧美日韩精品| 欧美午夜视频在线观看| 国产精品v欧美精品∨日韩| 国产精品videosex极品| 国产精品最新自拍| 伊人一区二区三区久久精品| 亚洲精品123区| 一区二区精品| 久久精品人人| 欧美国产先锋| 亚洲视频精品在线| 欧美专区一区二区三区| 欧美暴力喷水在线| 欧美日韩中文在线观看| 国产午夜精品美女毛片视频| 伊人久久综合| 亚洲一区二区三区在线| 久久精品导航| 亚洲精品国产品国语在线app| 99精品欧美| 久久久久久伊人| 欧美日韩视频一区二区| 国产亚洲综合在线| 亚洲精品永久免费精品| 欧美一区二区成人| 亚洲国产天堂久久综合| 亚洲在线观看视频网站| 欧美成人免费小视频| 国产亚洲精品久久久久婷婷瑜伽| 亚洲激情在线观看视频免费| 亚洲欧美在线aaa| 亚洲东热激情| 久久本道综合色狠狠五月| 欧美日韩国产成人在线免费| 国产自产2019最新不卡| 在线一区二区三区做爰视频网站| 久久婷婷国产麻豆91天堂| 夜夜嗨av色一区二区不卡| 美女脱光内衣内裤视频久久影院| 国产精品美女久久| 亚洲精品视频免费| 免费不卡在线观看| 性久久久久久| 国产精品美女久久久免费| 99综合视频|