欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
設計模式學(xué)習筆記(九)——Composite組合模式

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

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

       Composite組合模式結構如下:



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

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

       public abstract class AbstractClass

    {

        public string name;

        public ArrayList list;

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

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

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

    }

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

       枝節點(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;

        }

 

    }

    葉子節點(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;

        }

    }

    對于葉子節點(diǎn)來(lái)說(shuō),不需要子節點(diǎn),當然也就不需要添加和刪除子節點(diǎn)的方法。

    好,接下來(lái),我們可以在客戶(hù)程序中組建一棵樹(shù),來(lái)測試一下:

        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,

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

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

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

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

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

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

posted on 2006-06-02 17:31 KiddLee 閱讀(2084) 評論(4)  編輯 收藏 引用 網(wǎng)摘 所屬分類(lèi): 設計模式

FeedBack:
# 
怎么回復有廣告,請管理員盡快清除!  回復  更多評論
  
# re: 設計模式學(xué)習筆記(九)——Composite組合模式 2006-06-03 18:18 kid_li
我寫(xiě)blog是想和大家討論學(xué)習到的東西,請不要在這發(fā)廣告,所有廣告的回復將被刪除,謝謝合作  回復  更多評論
  
# re: 設計模式學(xué)習筆記(九)——Composite組合模式 2006-06-03 18:22 kid_li
@免費下載
謝謝你的夸獎,但是請不要在這里發(fā)廣告,所以你的回復暫時(shí)先刪除,請諒解  回復  更多評論
  
# 設計模式 --- 組合模式(Composite) 精選經(jīng)驗合集[TrackBack] 2007-03-15 09:11 阿鳥(niǎo)
設計模式 --- 組合模式(Composite) 精選經(jīng)驗合集  查看原文  回復  更多評論
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
合成(Composite)模式
結構型模式之組合模式
C#設計模式-組合模式(Composite Pattern)
.Net中的設計模式——Composite模式
Matlab組合模式
合成模式
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久