设计模式(十三):组合模式

一、定义

将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

二、实例:总店—加盟店

总店和加盟店实行的会员制度一样,但是总店和加盟店又是一个层级关系。这样的关系使得形成了一张树状图。

根节点—子节点—叶子

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();
复制代码

结果:

三、总结

需求中有部分和整体的关系,并且部分和整体的表达近乎一致。就可考虑使用组合模式。

posted @   K战神  阅读(259)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示