日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Composite組合模式

 Coder編程 2021-07-06

>>返回《C#常用設(shè)計模式》

1. 簡介

  • 定義
    • 組合多個對象形成樹形結(jié)構(gòu)以表示具有部分-整體關(guān)系的層次結(jié)構(gòu)。
    • 組合模式讓調(diào)用程序可以統(tǒng)一對待單個對象和組合對象
  • 案例
    • 例如文件系統(tǒng)的文件夾和文件結(jié)構(gòu)就是此模式
    • winform中,空間的基類是Control類型,子類有的是單一類型(Textbox),有的是容器類型(Panel),Add和Remove方法使用暴露Collections的方式,都有方法(eachChild)

2. 示例

namespace WindowsFormsApplication1
{
    //抽象的部件類描述將來所有部件共有的行為
    public abstract class Component
    {
        protected string name;
        public string Name
        {
            get
            {
                return name;
            }
            set
            {
                name = value;
            }
        }
        //添加部件
        public abstract void Add(Component component);
        //刪除部件
        public abstract void Remove(Component component);
        //遍歷所有子部件
        public abstract void eachChild();
    }

    //組合部件類
    public class Leaf : Component
    {
        //葉子節(jié)點不具備添加的能力,所以不實現(xiàn)
        public override void Add(Component component)
        {
            throw new NotImplementedException();
        }

        //葉子節(jié)點不具備添加的能力必然也不能刪除
        public override void Remove(Component component)
        {
            throw new NotImplementedException();
        }

        //葉子節(jié)點沒有子節(jié)點所以顯示自己的執(zhí)行結(jié)果
        public override void eachChild()
        {
            Console.WriteLine("{0}執(zhí)行了..", name);
        }
    }

    //組合類
    public class Composite : Component
    {
        //用來保存組合的部件
        List<Component> myList = new List<Component>();

        //添加節(jié)點 添加部件
        public override void Add(Component component)
        {
            myList.Add(component);
        }

        //刪除節(jié)點 刪除部件
        public override void Remove(Component component)
        {
            myList.Remove(component);
        }

        //遍歷子節(jié)點
        public override void eachChild()
        {
            Console.WriteLine("{0}執(zhí)行了..", name);
            foreach (Component c in myList)
            {
                c.eachChild();
            }
        }
    }
    class Client
    {
        static void Main(string[] args)
        {
            //構(gòu)造根節(jié)點
            Composite rootComponent = new Composite();
            rootComponent.Name = "根節(jié)點";

            //添加兩個葉子幾點,也就是子部件
            Leaf l = new Leaf();
            l.Name = "葉子節(jié)點一";
            Leaf l1 = new Leaf();
            l1.Name = "葉子節(jié)點二";

            rootComponent.Add(l);
            rootComponent.Add(l1);

            //遍歷組合部件
            rootComponent.eachChild();
        }
    }
}

3. 適用環(huán)境

  • 在具有整體和部分層次的結(jié)構(gòu)中,希望通過一種方式忽略整體與部分的差異,一致的對待它們
  • 在一個使用面向?qū)ο笳Z言開發(fā)的系統(tǒng)中要處理一個樹形結(jié)構(gòu)
  • 在一個系統(tǒng)總能夠分離出葉子容器對象,而且它們的類型不固定,需要增加一些新的類型

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多