設計模式-組合模式

煮詩君發表於2020-09-04

前言

點選檢視:設計模式系列

組合模式(Composite)

定義:將物件組合成樹形結構,表示層次結構關係,並且讓物件能夠以同樣的方式呈現給客戶端程式。

舉例:

家族譜的編寫:

男性:可傳宗接代,也有權利把一些人剔除族譜。

女性:記錄到家譜中,但不能傳宗接代。

理解:每一個小家庭中,爸爸媽媽和我,都是爸爸做主,可踢出我跟媽媽中的任何一個,也可增加任何一個。元件模式中的元件可以是單獨一個物件組成,也可以是多個元件組成(一個家庭,甚至一個家庭的多級延續);

類圖:

族員共性程式碼:

   //// <summary>
    /// //族人 抽象出來的族人共性
    /// </summary>
    public abstract class Father
    {
        //族人的姓名
        protected string name = string.Empty;
        public string Name
        {
            get
            {
                return name;
            }
        }

        //增加後代
        public abstract void Add(Father boy);
        //逐出家譜
        public abstract void Remove(Father boy);

        //定義所有族人,做個簡介
        public abstract void Intro();
    }

家族成員程式碼

 //男性後代
    public class Boy : Father
    {
        //建構函式
        public Boy() { }
        public Boy(string Name)
        {
            this.name = Name;
        }

        List<Father> myFamily = new List<Father>();

        //自我簡介
        public override void Intro()
        {
            Console.WriteLine("我是:{0};", Name);
            foreach (Father f in myFamily)
            {
                f.Intro();
            }
        }

        //增加後代
        public override void Add(Father boy)
        {
            myFamily.Add(boy);
        }

        //逐出家譜
        public override void Remove(Father boy)
        {
            myFamily.Remove(boy);
        }
    }

    //女性後代 
    public class Gril : Father
    {
        //建構函式
        public Gril() { }
        public Gril(string Name)
        {
            this.name = Name;
        }
        //自我簡介
        public override void Intro()
        {
            Console.WriteLine("我是:{0};", Name);
        }
        //不能新增
        public override void Add(Father store)
        {
            throw new NotImplementedException();
        }
        //不能刪除
        public override void Remove(Father store)
        {
            throw new NotImplementedException();
        }
    }

客戶端程式碼:

       public static void Main()
        {
            //爺爺取老婆
            Boy yeye = new Boy("爺爺");
            Gril nainai = new Gril("奶奶");
            yeye.Add(nainai);

            //爺爺要孩子
            Boy baba = new Boy("爸爸");
            Gril gugu = new Gril("姑姑");            
            yeye.Add(gugu);
            yeye.Add(baba);

            //爸爸要我
            Boy me = new Boy("me");
            baba.Add(me);

            //我要孩子
            Boy son = new Boy("son");
            me.Add(son);

            //爺爺的大家庭,族譜做介紹
            yeye.Intro();

            Console.Read();
        }

組合模式總結

有組合模式的案例可知:客戶端程式碼,很容易組建層次結構,並且層次分明,同時又很容易遍歷所有的元件集合。但要注意理解組合模式中的節點與頁,節點可刪可加,頁則不能增刪。

大家都好好理解,消化下這個模式,想想都那裡,那種情況下能使這個模式的特性發揮的淋漓盡職。

歡迎加入部落格左上方群,交流探討,設計模式,資料庫,c#.net,資料結構。

 

相關文章