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

大龍的博客

常用鏈接

統(tǒng)計(jì)

最新評(píng)論

設(shè)計(jì)模式學(xué)習(xí)筆記(九)——Composite組合模式

      Composite組合模式主要是應(yīng)對(duì)這樣的問題:一類具有“容器特征”的對(duì)象——即他們?cè)诔洚?dāng)對(duì)象的同時(shí),又是其他對(duì)象的容器的情況。在編寫時(shí)我們常常會(huì)造成:客戶代碼過多地依賴于對(duì)象容器復(fù)雜的內(nèi)部實(shí)現(xiàn),對(duì)象容器內(nèi)部實(shí)現(xiàn)結(jié)構(gòu)(而非抽象接口)的變化將引起客戶代碼的頻繁變化,帶來了代碼的維護(hù)性、擴(kuò)展性的弊端。

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

       Composite組合模式結(jié)構(gòu)如下:

 


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

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

       public abstract class AbstractClass

    {

        public string name;

        public ArrayList list;

        public abstract void Add(AbstractClass item);       //增加一個(gè)子節(jié)點(diǎn)

        public abstract void Remove(AbstractClass item);    //去掉一個(gè)子節(jié)點(diǎn)

        public abstract string Print();                     //打印當(dāng)前節(jié)點(diǎn)

    }

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

       枝節(jié)點(diǎn):

       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é)點(diǎn):

    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;

        }

    }

    對(duì)于葉子節(jié)點(diǎn)來說,不需要子節(jié)點(diǎn),當(dāng)然也就不需要添加和刪除子節(jié)點(diǎn)的方法。

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

        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();

        }

    輸出結(jié)果如下:

1

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

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

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

最后在來說說Composite組合模式的幾個(gè)要點(diǎn):

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

2、將“客戶代碼與復(fù)雜的對(duì)象容器結(jié)構(gòu)”解耦是Composite模式的核心思想,解耦之后,客戶代碼將與純粹的對(duì)象接口——而非對(duì)象容器的復(fù)雜內(nèi)部實(shí)現(xiàn)結(jié)構(gòu)——發(fā)生依賴關(guān)系,從而更能“應(yīng)對(duì)變化”。

3、Composite模式中,是將“Add和Remove的和對(duì)象容器相關(guān)的方法”定義在“表示抽象對(duì)象的Component類”中,還是將其定義在“表示對(duì)象容器的Composite類”中,是一個(gè)關(guān)乎“透明性”和“安全性”的兩難問題,需要仔細(xì)權(quán)衡結(jié)構(gòu),這又是必須付出的代價(jià)。

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

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


只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   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>
            欧美77777| 红桃视频亚洲| 亚洲一区二区三区中文字幕| 久久成人精品一区二区三区| 性欧美videos另类喷潮| 欧美一区二区在线免费观看| 久久久天天操| 国产欧美综合在线| 亚洲日本中文字幕| 久久精品国产综合| 日韩网站在线| 亚洲午夜激情网页| 久久久久国产一区二区三区| 欧美日韩在线免费观看| 狠狠色综合网| 国产精品v日韩精品| 最近中文字幕mv在线一区二区三区四区| 91久久夜色精品国产九色| 亚洲激情成人在线| 久久激五月天综合精品| 亚洲欧美日韩在线不卡| 91久久精品www人人做人人爽| 性娇小13――14欧美| 欧美人成网站| 亚洲精品一二| 欧美专区亚洲专区| 欧美亚洲免费高清在线观看| 久久国产精品久久久久久电车 | 欧美日韩免费精品| 久久综合狠狠综合久久综合88| 国产精品a久久久久| 国产农村妇女精品| 国产美女搞久久| 欧美看片网站| 亚洲视屏在线播放| 女主播福利一区| 国产欧美大片| 欧美一区在线直播| 亚洲第一区中文99精品| 亚洲欧美在线视频观看| 欧美激情性爽国产精品17p| 99视频一区| 国产欧美在线观看一区| 欧美日韩免费在线| 日韩午夜电影av| 亚洲大胆视频| 久热精品视频在线| 久久久久久亚洲综合影院红桃| 国产精品欧美日韩一区二区| 亚洲欧美美女| 亚洲欧美在线播放| 国产日产高清欧美一区二区三区| 欧美一级黄色录像| 亚洲激情综合| 欧美手机在线视频| 亚洲欧美中文日韩v在线观看| 亚洲字幕一区二区| 精品二区视频| 亚洲欧洲三级电影| 欧美大片免费久久精品三p | 欧美日韩999| 一本色道婷婷久久欧美| av成人手机在线| 国产精品女主播在线观看| 欧美在线影院| 久久精品视频免费播放| 亚洲日本va午夜在线影院| 欧美成人有码| 国产精品福利在线观看| 国产精品一区二区三区久久| 欧美成人a视频| 欧美日韩美女在线| 久久久久久久久久久久久9999| 久久亚洲一区二区三区四区| 日韩视频在线一区二区三区| 欧美a级在线| 欧美激情五月| 欧美中在线观看| 一区二区欧美视频| 尤物精品国产第一福利三区| 亚洲国产99精品国自产| 国产精品久久久久久五月尺| 久久中文字幕一区二区三区| 在线亚洲激情| 亚洲欧洲日产国产综合网| 欧美伊人精品成人久久综合97| 国产精品久久久久久久久婷婷| 亚洲人成毛片在线播放| 亚洲九九爱视频| 欧美a级片网站| 欧美激情综合| 亚洲一区二区不卡免费| 欧美日韩精品伦理作品在线免费观看| 亚洲激情网站免费观看| 亚洲一区二区免费| 久久久久91| 欧美日韩成人一区| 久久婷婷人人澡人人喊人人爽| 日韩一级大片| 韩国av一区| 欧美在线视频观看免费网站| 亚洲精品一区二区网址| 亚洲精品视频在线观看网站 | 亚洲女同精品视频| 亚洲男人第一av网站| 美国成人直播| 亚洲国产综合91精品麻豆| 黄色成人av网站| 欧美一区二区三区久久精品茉莉花| 欧美专区在线观看| 国产精品男gay被猛男狂揉视频| 麻豆久久久9性大片| 亚洲高清电影| 久久一综合视频| 亚洲高清免费在线| 亚洲国产日韩一区二区| 久久综合色婷婷| 99成人在线| 国产精品99久久久久久久久| 国产精品视频网址| 亚洲欧美久久久| 欧美在线欧美在线| 亚洲国产成人精品视频| 美女国产一区| 一区二区三区 在线观看视| 亚洲欧美www| 国产精品日韩电影| 久久视频精品在线| 欧美激情视频在线免费观看 欧美视频免费一| 亚洲欧洲在线免费| 欧美巨乳波霸| 亚洲小说欧美另类婷婷| 老司机67194精品线观看| 激情久久综合| 欧美视频在线视频| 亚洲欧美美女| 老司机精品福利视频| 一区二区不卡在线视频 午夜欧美不卡'| 欧美激情国产精品| 亚洲一区二区视频在线| 久久久人成影片一区二区三区观看| 狠狠狠色丁香婷婷综合久久五月 | 亚洲一区免费看| av成人动漫| 99精品视频免费观看| 亚洲蜜桃精久久久久久久| 亚洲一区二区三区四区五区黄| 日韩视频专区| 欧美一区二区三区久久精品| 欧美激情一区二区三区全黄| 六月丁香综合| 久久精品亚洲一区| 久久另类ts人妖一区二区| 国内精品久久久久影院 日本资源| 欧美精品 国产精品| 一区二区三区日韩在线观看| 亚洲天堂av图片| 国产综合色产在线精品| 欧美成人自拍视频| 久久精品首页| 在线视频欧美一区| 91久久精品久久国产性色也91| 欧美一区二区私人影院日本| 亚洲福利国产精品| 极品日韩av| 国产精品久久久久77777| 欧美黄色精品| 久久精品成人一区二区三区蜜臀 | 久久久久久久久久久久久9999| 国产在线播精品第三| 欧美伦理在线观看| 久久精品国产精品亚洲| 在线一区二区三区四区五区| 欧美国产精品一区| 欧美一区二区三区在| 国产综合色在线| 欧美少妇一区| 欧美成人综合网站| 久久婷婷蜜乳一本欲蜜臀| 亚洲午夜小视频| 免费成人av资源网| 麻豆精品视频在线观看| 久久成年人视频| 久久精品欧美| 香蕉成人久久| 亚洲一区久久久| 午夜精品一区二区在线观看 | 亚洲欧美乱综合| 午夜精品久久久久久久99黑人| 一本色道久久综合狠狠躁篇的优点 | 欧美一区二区视频网站| 欧美一区二区三区免费观看 | 免费在线视频一区| 久久久精品国产免大香伊| 久久亚洲欧美| 久久在线免费观看视频| 欧美国产日韩亚洲一区| 欧美激情成人在线| 欧美精品在线观看91| 欧美国产第一页|