設計模式(十三):組合模式

K戰神發表於2016-01-15

一、定義

將物件組合成樹形結構以表示‘部分-整體’的層次結構。組合模式使得使用者對單個物件和組合物件的使用具有一致性。

二、例項:總店—加盟店

總店和加盟店實行的會員制度一樣,但是總店和加盟店又是一個層級關係。這樣的關係使得形成了一張樹狀圖。

根節點—子節點—葉子

2.1 抽象組合關係

//--------------組合-------------------
    public abstract class Company
    {
        public string ShopID { get; set; }
        public Company(string shopID)
        {
            ShopID = shopID;
        }
        public abstract void AddShop(Company shop);
        public abstract void RemoveShop(Company shop);
        public abstract void DisplayShops();        
    }

2.2 定義 節點和葉子

 //--------------節點--------------------
    public class Headquarters : Company
    {
        List<Company> shops = new List<Company>();
        public Headquarters(string shopID) : base(shopID)
        {          
        }
        public override void AddShop(Company shop)
        {
            shops.Add(shop);
        }      
        public override void RemoveShop(Company shop)
        {
            shops.Remove(shop);
        }
        public override void DisplayShops()
        {
            foreach (var shop in shops)
            {
                Console.WriteLine("展示店鋪:"+shop.ShopID);
            }
        }
    }
//-------------------葉子---------------------------
    public class Shop : Company
    {
        public Shop(string shopid) : base(shopid)
        {
        }        
        public override void AddShop(Company shop)
        {
            Console.WriteLine("暫無下級");
        }

        public override void DisplayShops()
        {
            throw new NotImplementedException();
        }

        public override void RemoveShop(Company shop)
        {
            Console.WriteLine("暫無下級");
        }
    }

2.3 客戶端

 //---------------------組合模式------------------------
            Component.Company baseShop = new Component.Headquarters("華北區");
            baseShop.AddShop(baseShop);
            Component.Company shop_1 = new Component.Shop("加盟店:NO.1");
            baseShop.AddShop(shop_1);
            Component.Company shop_2 = new Component.Shop("加盟店:NO.2");
            baseShop.AddShop(shop_2);
            baseShop.DisplayShops();
            Console.ReadKey();

結果:

三、總結

需求中有部分和整體的關係,並且部分和整體的表達近乎一致。就可考慮使用組合模式。

相關文章