• <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>

            C++ Programmer's Cookbook

            {C++ 基礎} {C++ 高級} {C#界面,C++核心算法} {設計模式} {C#基礎}

            模式設計c#--結構型--composite

            名稱 Composite
            結構 o_composite.bmp
            意圖 將對象組合成樹形結構以表示“部分-整體”的層次結構。C o m p o s i t e 使得用戶對單個對象和組合對象的使用具有一致性。
            適用性
            • 你想表示對象的部分-整體層次結構。
            • 你希望用戶忽略組合對象與單個對象的不同,用戶將統一地使用組合結構中的所有對象。

            Code Example
            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類型的對象可以包含其它Component類型的對象。換而言之,Composite類型對象可以含有其它的樹枝(Composite)類型或樹葉(Leaf)類型的對象。

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

            透明方式

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

            這個選擇的缺點是不夠安全,因為樹葉類對象和合成類對象在本質上是有區別的。樹葉類對象不可能有下一個層次的對象,因此add()、remove()以及getChild()方法沒有意義,是在編譯時期不會出錯,而只會在運行時期才會出錯。

            安全方式

            第二種選擇是在Composite類里面聲明所有的用來管理子類對象的方法。這樣的做法是安全的做法,因為樹葉類型的對象根本就沒有管理子類對象的方法,因此,如果客戶端對樹葉類對象使用這些方法時,程序會在編譯時期出錯。

            這個選擇的缺點是不夠透明,因為樹葉類和合成類將具有不同的接口。

            這兩個形式各有優缺點,需要根據軟件的具體情況做出取舍決定。

            安全式的合成模式實現: 只有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?);
            ??}

            }

            ?透明式的合成模式實現: 每個里都有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?);
            ??}

            }

            posted on 2006-01-03 15:45 夢在天涯 閱讀(928) 評論(2)  編輯 收藏 引用 所屬分類: Design pattern

            評論

            # re: 模式設計c#--結構型--composite 2006-05-18 16:00 夢在天涯

            用戶感覺不到他在處理結合還是一個單體> 這就是此模式的用處所在


              回復  更多評論   

            # re: 模式設計c#--結構型--composite 2006-05-18 16:09 夢在天涯

            用處: 在c++中用基類指針的數組,在c#中用arraylist都可以 來表示一個帶有分支的樹結構  回復  更多評論   

            公告

            EMail:itech001#126.com

            導航

            統計

            • 隨筆 - 461
            • 文章 - 4
            • 評論 - 746
            • 引用 - 0

            常用鏈接

            隨筆分類

            隨筆檔案

            收藏夾

            Blogs

            c#(csharp)

            C++(cpp)

            Enlish

            Forums(bbs)

            My self

            Often go

            Useful Webs

            Xml/Uml/html

            搜索

            •  

            積分與排名

            • 積分 - 1804314
            • 排名 - 5

            最新評論

            閱讀排行榜

            伊人久久大香线蕉精品不卡| 亚洲成人精品久久| 国产情侣久久久久aⅴ免费| 久久久久国产成人精品亚洲午夜| 九九久久自然熟的香蕉图片| 中文字幕日本人妻久久久免费| 欧美色综合久久久久久| 久久久精品人妻无码专区不卡 | 日本亚洲色大成网站WWW久久| 国产一久久香蕉国产线看观看| 91精品国产色综合久久| 久久不见久久见免费视频7| 久久99精品久久久久久动态图 | 久久久青草青青国产亚洲免观| 久久久久中文字幕| 91精品国产综合久久四虎久久无码一级 | 久久久无码精品午夜| 国产毛片久久久久久国产毛片 | 久久丝袜精品中文字幕| 国产精品无码久久四虎| 观看 国产综合久久久久鬼色 欧美 亚洲 一区二区| 99re久久精品国产首页2020| 狠狠色婷婷久久一区二区三区| 1000部精品久久久久久久久| 一本大道加勒比久久综合| 久久精品无码一区二区app| 久久一区二区三区99| 亚洲午夜久久久久妓女影院 | 69久久夜色精品国产69| AA级片免费看视频久久| 久久久久久一区国产精品| 国产香蕉久久精品综合网| 香蕉久久夜色精品升级完成 | 久久精品国产99国产精品| 91麻豆国产精品91久久久| 99久久久精品| 久久乐国产综合亚洲精品| 久久永久免费人妻精品下载| 久久久久这里只有精品| 99久久无码一区人妻a黑| 久久这里都是精品|