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

隨筆-20  評(píng)論-0  文章-0  trackbacks-0

  1.概述

     組合模式有時(shí)候又叫做部分-整體模式,它使我們樹型結(jié)構(gòu)的問題中,模糊了簡單元素和復(fù)雜元素的概念,客戶程序可以向處理簡單元素一樣來處理復(fù)雜元素,從而使得客戶程序與復(fù)雜元素的內(nèi)部結(jié)構(gòu)解耦。

     組合模式(Composite Pattern):將對(duì)象組合成樹形結(jié)構(gòu)以表示‘部分-整體’的層次結(jié)構(gòu),組合模式使得用戶對(duì)單個(gè)對(duì)象和組合對(duì)象的使用具有一致性。

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

     結(jié)構(gòu)圖說明:

     (1)Component:組合中的對(duì)象聲明接口,在適當(dāng)情況下實(shí)現(xiàn)所有類共有的默認(rèn)行為,聲明一個(gè)接口用于訪問和管理Component的子組件。在遞歸結(jié)構(gòu)中定義一個(gè)接口,用于訪問一個(gè)父部件,并在合適的情況下實(shí)現(xiàn)它。(可選)

     (2)Leaf:在組合中表示葉節(jié)點(diǎn),葉節(jié)點(diǎn)沒有子節(jié)點(diǎn),定義對(duì)象的基本行為。

     (3)Composite:定義有子部件的那些部件的行為,存儲(chǔ)子部件并在Component接口實(shí)現(xiàn)與子部件有關(guān)的操作。

     (4)Client:通過Component接口操作組合部件的對(duì)象。

     組合模式基本代碼:

    public abstract class Component
    {
        protected string name;

        public Component(string name)
        {
            this.name = name;
        }

        public abstract void Add(Component c);
        public abstract void Remove(Component c);
        public abstract void Display(int depth);
    }

     Composite:

public class Composite : Component
    {
        private List<Component> children = new List<Component>();

        public Composite(string name)
            : base(name)
        { }

        public override void Add(Component c)
        {
            children.Add(c);
        }

        public override void Remove(Component c)
        {
            children.Remove(c);
        }

        public override void Display(int depth)
        {
            Console.WriteLine(new String('-', depth) + name);

            foreach (Component component in children)
            {
                component.Display(depth + 2);
            }
        }
    }

     Leaf:

    public class Leaf : Component
    {
        public Leaf(string name)
            : base(name)
        { }

        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);
        }
    }
客戶端:
    public class Program
    {
        static void Main(string[] args)
        {
            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);

            Composite comp2 = new Composite("Composite XY");
            comp2.Add(new Leaf("Leaf XYA"));
            comp2.Add(new Leaf("Leaf XYB"));

            comp.Add(comp2);

            root.Add(new Leaf("Leaf C"));

            Leaf leaf = new Leaf("Leaf D");
            root.Add(leaf);
            root.Remove(leaf);

            root.Display(1);

            Console.Read();
        }
    }

     可以看出,Composite類型的對(duì)象可以包含其它Component類型的對(duì)象。換而言之,Composite類型對(duì)象可以含有其它的樹枝(Composite)類型或樹葉(Leaf)類型的對(duì)象。

     組合模式的實(shí)現(xiàn)根據(jù)所實(shí)現(xiàn)接口的區(qū)別分為兩種形式,分別稱為安全模式和透明模式。組合模式可以不提供父對(duì)象的管理方法,但組合模式必須在合適的地方提供子對(duì)象的管理方法(諸如:add、remove等)。安全式的組合模式要求管理聚集的方法只出現(xiàn)在樹枝構(gòu)件類中,而不出現(xiàn)在樹葉構(gòu)件中。與安全式的組合模式不同的是,透明式的組合模式要求所有的具體構(gòu)件類,不論樹枝構(gòu)件還是樹葉構(gòu)件,均符合一個(gè)固定的接口。

     透明模式:也就是說在Component中聲明所有用來管理子對(duì)象的方法,其中包括Add、Remove等。這樣實(shí)現(xiàn)Component接口的所有子類都具備了Add和Remove。這樣做的好處就是葉節(jié)點(diǎn)和枝節(jié)點(diǎn)對(duì)于外界沒有區(qū)別,它們具有完全一致的行為接口,但問題也很明顯,因?yàn)長eaf類本身不具備Add(),Remove()方法的功能,所以實(shí)現(xiàn)他是沒有意義的。

     安全模式:就是在Component接口中不去聲明Add和Remove方法,那么子類的Leaf也就不需要去實(shí)現(xiàn)它,而是在Composite聲明所有用來管理子類對(duì)象的方法,這樣就不會(huì)出現(xiàn)透明模式出現(xiàn)的問題,不過由于不夠透明,所以葉節(jié)點(diǎn)和枝節(jié)點(diǎn)將不具有相同的接口,客戶端調(diào)用需要做相應(yīng)的判斷,帶來了不便。

     2.實(shí)例(大話設(shè)計(jì)模式)

     大話設(shè)計(jì)模式中的公司管理系統(tǒng)的結(jié)構(gòu)圖如下:

     具體實(shí)現(xiàn)代碼如下:

CompanyComposite
  public abstract class Company
    {
        protected string name;

        public Company(string name)
        {
            this.name = name;
        }

        public abstract void Add(Company c);//增加
        public abstract void Remove(Company c);//移除
        public abstract void Display(int depth);//顯示
        public abstract void LineOfDuty();//履行職責(zé)

    }

    public class ConcreteCompany : Company
    {
        private List<Company> children = new List<Company>();

        public ConcreteCompany(string name)
            : base(name)
        { }

        public override void Add(Company c)
        {
            children.Add(c);
        }

        public override void Remove(Company c)
        {
            children.Remove(c);
        }

        public override void Display(int depth)
        {
            Console.WriteLine(new String('-', depth) + name);

            foreach (Company component in children)
            {
                component.Display(depth + 2);
            }
        }

        //履行職責(zé)
        public override void LineOfDuty()
        {
            foreach (Company component in children)
            {
                component.LineOfDuty();
            }
        }

    }

    //人力資源部
    public class HRDepartment : Company
    {
        public HRDepartment(string name)
            : base(name)
        { }

        public override void Add(Company c)
        {
        }

        public override void Remove(Company c)
        {
        }

        public override void Display(int depth)
        {
            Console.WriteLine(new String('-', depth) + name);
        }


        public override void LineOfDuty()
        {
            Console.WriteLine("{0} 員工招聘培訓(xùn)管理", name);
        }
    }

    //財(cái)務(wù)部
    public class FinanceDepartment : Company
    {
        public FinanceDepartment(string name)
            : base(name)
        { }

        public override void Add(Company c)
        {
        }

        public override void Remove(Company c)
        {
        }

        public override void Display(int depth)
        {
            Console.WriteLine(new String('-', depth) + name);
        }

        public override void LineOfDuty()
        {
            Console.WriteLine("{0} 公司財(cái)務(wù)收支管理", name);
        }

    }

     客戶端代碼:

Code
 public class Program
    {
        static void Main(string[] args)
        {
            ConcreteCompany root = new ConcreteCompany("北京總公司");
            root.Add(new HRDepartment("總公司人力資源部"));
            root.Add(new FinanceDepartment("總公司財(cái)務(wù)部"));

            ConcreteCompany comp = new ConcreteCompany("上海華東分公司");
            comp.Add(new HRDepartment("華東分公司人力資源部"));
            comp.Add(new FinanceDepartment("華東分公司財(cái)務(wù)部"));
            root.Add(comp);

            ConcreteCompany comp1 = new ConcreteCompany("南京辦事處");
            comp1.Add(new HRDepartment("南京辦事處人力資源部"));
            comp1.Add(new FinanceDepartment("南京辦事處財(cái)務(wù)部"));
            comp.Add(comp1);

            ConcreteCompany comp2 = new ConcreteCompany("杭州辦事處");
            comp2.Add(new HRDepartment("杭州辦事處人力資源部"));
            comp2.Add(new FinanceDepartment("杭州辦事處財(cái)務(wù)部"));
            comp.Add(comp2);


            Console.WriteLine("\n結(jié)構(gòu)圖:");

            root.Display(1);

            Console.WriteLine("\n職責(zé):");

            root.LineOfDuty();


            Console.Read();
        }
    }

     在.NET中,一個(gè)典型的組合模式實(shí)例就是.NET的控件,如Button,TextBox和Label等,這些控件都是繼承自Control類,該類自身包含ControlCollection的集合Controls,控件和子控件的邏輯關(guān)系如下圖:

 

     3.總結(jié)

     何時(shí)采用組合模式:

     1.需求重要體現(xiàn)部分與整體的層次結(jié)構(gòu)時(shí)

     2.你希望用戶忽略組合對(duì)象與單個(gè)對(duì)象的不同,用戶將統(tǒng)一地使用組合結(jié)構(gòu)中的所有對(duì)象。

     使用效果:

     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ì)象容器的復(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)衡。這里有可能違背面向?qū)ο蟮?#8220;單一職責(zé)原則”,但是對(duì)于這種特殊結(jié)構(gòu),這又是必須付出的代價(jià)。ASP.NET控件的實(shí)現(xiàn)在這方面為我們提供了一個(gè)很好的示范。
     4.Composite模式在具體實(shí)現(xiàn)中,可以讓父對(duì)象中的子對(duì)象反向追溯;如果父對(duì)象有頻繁的遍歷需求,可使用緩存技巧來改善效率。

     參考資料:

      大化設(shè)計(jì)模式

     http://terrylee.cnblogs.com/archive/2006/03/11/347919.html

原帖地址:

http://www.cnblogs.com/peida/archive/2008/09/09/1284686.html


posted on 2016-02-14 14:36 Magic 閱讀(290) 評(píng)論(0)  編輯 收藏 引用 所屬分類: C/C++java設(shè)計(jì)模式
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            免费成人美女女| 亚洲美洲欧洲综合国产一区| 亚洲综合日韩| 一本一本久久a久久精品牛牛影视| 久久精品免费看| 亚洲桃色在线一区| 一本大道久久a久久精品综合| 亚洲国产天堂久久综合| 亚洲国产精品激情在线观看| 国产在线精品二区| 99精品欧美一区二区蜜桃免费| 亚洲一区二区三区在线看| 久久一区国产| 久久超碰97人人做人人爱| 国产欧美精品一区aⅴ影院| 久久久www成人免费无遮挡大片| 久久久久综合| 欧美jizz19性欧美| 香蕉成人伊视频在线观看| 免费观看日韩av| 日韩一二三区视频| 久久视频一区| 一本色道久久综合狠狠躁篇的优点| 亚洲欧美国产毛片在线| 亚洲特黄一级片| 久久精品91久久香蕉加勒比| 久久久五月婷婷| 牛夜精品久久久久久久99黑人| 91久久精品日日躁夜夜躁欧美| 欧美激情一级片一区二区| 亚洲无限乱码一二三四麻| 欧美伊人久久久久久久久影院| 亚洲国产精品综合| 国产精品一区二区久激情瑜伽| 国产一级久久| 午夜精品视频一区| 亚洲精选大片| 欧美成人综合在线| 亚洲国产高清一区| 免费观看一区| 可以免费看不卡的av网站| 国产精品热久久久久夜色精品三区| 亚洲激情六月丁香| 美女脱光内衣内裤视频久久影院 | 国产精品视频网站| 韩国成人理伦片免费播放| 欧美亚洲日本国产| 亚洲一区免费看| 国产精品自拍在线| 久久久久久久久岛国免费| 久久国产精品网站| 亚洲国产日韩在线一区模特| 蜜臀久久99精品久久久久久9 | 亚洲欧美成人一区二区在线电影 | 国产一区二区三区四区三区四| 午夜精品久久久久久久99水蜜桃| 99国产精品久久| 欧美一区二区精品| 午夜视频在线观看一区| 伊人影院久久| 亚洲欧美日韩综合一区| 在线观看成人av| 夜夜嗨av色综合久久久综合网| 国产日韩欧美精品一区| 亚洲国产成人精品女人久久久 | 欧美片第一页| 亚洲国产小视频在线观看| 久久久久免费| 久久久成人精品| 亚洲电影网站| 亚洲性图久久| 亚洲国产精品v| 亚洲精品日产精品乱码不卡| 亚洲一品av免费观看| 久久天天狠狠| 国产色视频一区| 在线中文字幕不卡| 久久久亚洲高清| 亚洲精品社区| 久久久亚洲午夜电影| 欧美视频在线一区二区三区| 国产欧美精品日韩| 欧美一区二区三区免费观看 | 久久国产精彩视频| 久久久一区二区三区| 亚洲综合99| 欧美日韩在线精品| 亚洲影院一区| 久久精品国产99| 国产精品久久久久婷婷| 久久久噜久噜久久综合| 国产精品影院在线观看| 欧美一区二区三区免费观看| 久久精品国产2020观看福利| 国产精品一区二区三区四区五区| 99成人在线| 一区二区视频欧美| 亚洲天堂av在线免费| 亚洲私人影院| 国产精品人人做人人爽人人添| 亚洲一区二区三区四区在线观看| 午夜激情综合网| 亚洲国产激情| 久久久久一区二区| 欧美另类视频| 夜夜躁日日躁狠狠久久88av| 亚洲精品日产精品乱码不卡| 欧美精品激情blacked18| 99re成人精品视频| 美女脱光内衣内裤视频久久网站| 亚洲免费精彩视频| 亚洲大胆av| 亚洲经典在线看| 国产精品久久久久久久久久尿| 久久久久综合| 校园激情久久| 欧美电影在线| 亚洲精品123区| 亚洲激情一区| 亚洲在线1234| 夜色激情一区二区| 亚洲福利免费| 免费看成人av| 亚洲国产成人高清精品| 欧美激情综合| 一本高清dvd不卡在线观看| 亚洲欧美在线aaa| 亚洲美女视频在线观看| 美女福利精品视频| 中文国产成人精品久久一| 国产在线观看一区| 国产精品久久77777| 欧美精品日韩三级| 欧美日韩视频在线| 欧美激情一二三区| 欧美视频精品在线观看| 国产精品一二三| 欧美日韩免费一区| 亚洲午夜av在线| 亚洲福利视频一区| 久久高清福利视频| 亚洲一区二区成人| 亚洲午夜免费视频| 亚洲国产欧美日韩| 日韩一二三区视频| 亚洲免费黄色| 久久嫩草精品久久久久| 国产精品啊v在线| 久久亚洲精品伦理| 久热爱精品视频线路一| 久久久久成人网| 美女亚洲精品| 欧美天堂亚洲电影院在线观看 | 欧美成人免费网| 久久综合九色综合网站| 欧美不卡激情三级在线观看| 亚洲国产成人午夜在线一区 | 亚洲一区图片| 裸体女人亚洲精品一区| 日韩视频在线免费| 蜜桃精品久久久久久久免费影院| 国产一区二区成人| 日韩午夜在线电影| 亚洲一区二区欧美日韩| 亚洲视频欧美视频| 亚洲精品久久久久| 亚洲一区国产精品| 久久综合999| 亚洲综合日韩| 国产欧美精品xxxx另类| 亚洲一区二区在线| 日韩一区二区久久| 狠狠做深爱婷婷久久综合一区| 亚洲精品久久久久久久久久久| 亚洲欧美日韩区 | 亚洲视频视频在线| 欧美中文字幕在线| 欧美系列电影免费观看| 黄网动漫久久久| 欧美在线亚洲一区| 国产亚洲精品aa| 亚洲午夜小视频| 日韩一级二级三级| 欧美—级a级欧美特级ar全黄| 亚洲无线视频| 欧美在线看片| 亚洲一区二区三区免费在线观看| 久久久久久一区| 狂野欧美激情性xxxx欧美| 亚洲二区免费| 亚洲精品午夜精品| 国产欧美日韩视频在线观看 | 国产一级久久| 老司机午夜精品视频在线观看| 久久久国产精品一区二区中文| 99精品免费网| 欧美激情一区二区| 久久久久久999| 欧美a级一区| 亚洲欧美日韩国产成人精品影院|