一、定義
將物件組合成樹形結構以表示‘部分-整體’的層次結構。組合模式使得使用者對單個物件和組合物件的使用具有一致性。
二、例項:總店—加盟店
總店和加盟店實行的會員制度一樣,但是總店和加盟店又是一個層級關係。這樣的關係使得形成了一張樹狀圖。
根節點—子節點—葉子
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();
結果:
三、總結
需求中有部分和整體的關係,並且部分和整體的表達近乎一致。就可考慮使用組合模式。