C#设计模式之【结构型设计模式:组合模式】

C#设计模式之【结构型设计模式:组合模式】

一.组合模式简述

  组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。
  这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。

  UML图:
在这里插入图片描述

二.代码示例

  我们的目标要实现下图的组织架构关系:

在这里插入图片描述
  分析得知:Composite对象(有子节点)为:LDG科技公司,产品部,业务部,研发部,其余为Leaf对象(没有子节点)

  抽象类代码:

  public abstract  class AbstractDepartment
    {
        /// <summary>
        /// 部门名称
        /// </summary>
        protected string _departmentName;

        public AbstractDepartment(string departmentName)
        {
            _departmentName = departmentName;
        }

        /// <summary>
        /// 添加子节点的方法
        /// </summary>
        public abstract void AddChildren(AbstractDepartment company);

        /// <summary>
        /// 删除子节点的方法
        /// </summary>
        public abstract void RemoveChildren(AbstractDepartment company);

        /// <summary>
        /// 获取子节点数据
        /// </summary>
        public abstract List<AbstractDepartment> GetChildren();

        /// <summary>
        /// 获取部门名称
        /// </summary>
        public abstract string GetdepartmentName();      

    }

  Leaf类代码:

    /// <summary>
    /// Leaf类
    /// </summary>
    public class LeafDepartment : AbstractDepartment
    {
        public LeafDepartment(string departmentName)
            : base(departmentName)
        {

        }
        public override void AddChildren(AbstractDepartment company)
        {
            throw new Exception("没有子节点,不能AddChild");
        }

        public override List<AbstractDepartment> GetChildren()
        {
            return null;
        }

        public override void RemoveChildren(AbstractDepartment company)
        {
            throw new Exception("没有子节点,不能RemoveChildren");
        }

        public override string GetdepartmentName()
        {
            return this._departmentName;
        }
    }

  Composite类代码:

    /// <summary>
    /// Composite类
    /// </summary>
    public class CompositeDepartment : AbstractDepartment
    {

         private  List<AbstractDepartment> list = new List<AbstractDepartment>();

        public CompositeDepartment(string departmentName) 
            : base(departmentName)
        {

        }

        public override void AddChildren(AbstractDepartment department)
        {
            list.Add(department);
        }

        public override void RemoveChildren(AbstractDepartment department)
        {
            list.Remove(department);
        }

        public override List<AbstractDepartment> GetChildren()
        {

            return list;
        }
        public override string GetdepartmentName()
        {
            return _departmentName;
        }
    }

  运行结果–>递归输出树形结构:

在这里插入图片描述

  递归代码:

        public static void FindChildren(AbstractDepartment acompositeDepartment,int intA)
        {
            if (acompositeDepartment.GetChildren() == null)
            {
                //说明没有子节点     
              
            }
            else
            {
                //说明有子节点          
                foreach (var item in acompositeDepartment.GetChildren())
                {      
                    for (int i = 0; i < intA; i++)
                    {
                        Console.Write("--");
                    }
                    Console.WriteLine($"{item.GetdepartmentName()}");                
                    FindChildren(item,intA+1);
                }

            }
        }

三.总结

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

主要解决: 它在我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。

何时使用: 1、您想表示对象的部分-整体层次结构(树形结构)。 2、您希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

如何解决: 树枝和叶子实现统一接口,树枝内部组合该接口。

优点: 1、高层模块调用简单。 2、节点自由增加。

缺点: 在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则

使用场景:部分、整体场景,如树形菜单,文件、文件夹的管理。

  
  
  
  
  
  

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#设计模式-结构型相关课件 合成模式(Composite) • 设计方案一: 合成模式(Composite) • 设计方案二 合成模式(Composite) • 设计方案一和设计方案二的区别 – 设计方案二使得客户端更不需要关心所需处理的组件的 类别 – 设计方案二需要对某类增加对额外操作行为的处理 • 实现方案二的Demo 合成模式(Composite) • 小结 – 该模式采用树形结构来实现普遍存在的对象容器,从而将“一对 多”的关系转化为“一对一”的关系,使得客户代码可以一致地 处理对象和对象容器,无需关心处理的是单个的对象,还是组合 的对象容器 – 将“客户代码与复杂的对象容器结构”解耦是合成模式的核心思 想,这样做之后,客户代码将与纯粹的抽象接口而非对象容器的 复杂内部实现结构发生依赖关系 – 合成模式中,是将“增加和删除等与容器相关的方法”定义在表 示抽象对象的Component类中,还是将其定义在“表示对象容器 的Composite类”中,是一个关乎“透明性”和“安全性”孰轻 孰重的选择,这需要仔细权衡 合成模式(Composite) • 练习 – 背景知识 • html语言中的<frameset>标签,<frameset>标签主要用来将一 个web页分割成不同的部分以方便在每一个部分显示不同的网 页,<frame>标签则用来在<frameset>标签中分割的某一部分 指定要显示的网页,并且一个<frameset>标签可以被嵌套到另 外一个<frameset>中。 – 一个使用<frameset>标签的html例子 合成模式(Composite) <html> <head></head> <frameset rows="80%,20%"> <frameset cols="100,200"> <frame src="frame1.html"></frame> <frame src="frame2.html"></frame> </frameset> <frame src="frame3.html"></fra
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值