[学习笔记:设计模式] 11_组合模式

定义:组合多个对象形成树形结构以表示具有部分—整体关系的层次结构。组合模式让客户端可以统一地对待单个对象和组合对象。


组合模式包含如下角色:

抽象构件角色(Component):它可以是接口或抽象类,为叶子组件和容器组件对象声明接口,在该角色中可以包含所有子类共有行为的声明和实现。

叶子构件角色(Leaf):表示叶子节点对象,叶子节点没有子节点,实现了在抽象组件类中定义的行为。

容器构件角色(Composite):表示容器节点对象,容器节点包含子节点,其子节点可以叶子节点,也可以是容器节点,提供了一个集合用于存储子节点,实现了在抽象组件类中定义的行为,包括访问及管理子组件的方法。



11.1 透明方式

举例
叶子节点(叶子构建)和非叶子节点(容器构建)

- 抽象构建

public abstract class Conponent
    {
        protected String name;
        public Conponent(String name)
        {
            this.name = name;
        }

        protected abstract List<Conponent> GetChild();
        public abstract void Operation();
        public abstract void Add();
        public abstract void Remove();

    }

- 叶子构建

public class Leaf : Conponent
    {
        public Leaf(String name):base(name)
        {

        }

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

        
        public override void Operation()
        {
            Console.WriteLine(name);
        }

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

        protected override List<Conponent> GetChild()
        {
            throw new NotImplementedException();
        }
    }

- 容器构建

public class Composite : Conponent
    {
        public Composite(String name) : base(name)
        {

        }

        public override void Add()
        {
            Console.WriteLine("添加叶子节点");
        }

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

        public override void Remove()
        {
            Console.WriteLine("移除叶子节点");
        }

        protected override List<Conponent> GetChild()
        {
            Console.WriteLine("返回所有叶子节点");

            return null;
        }


总结:透明方式组合,所有构建必须重新抽象构建声明的所有方法,负责会在运行阶段调用时会抛出异常。


11.2 安全方式

- 抽象构建

public abstract class Conponent
    {
        protected String name;
        public Conponent(String name)
        {
            this.name = name;
        }

        public abstract void Operation();
    }

- 叶子构建

public class Leaf : Conponent
    {
        public Leaf(String name):base(name)
        {

        }

        public override void Operation()
        {
            Console.WriteLine(name);
        }
    }

- 容器构建

public class Composite : Component
    {
        private List<Component> components = new List<Component>();

        public Composite(String name) : base(name)
        {

        }

        public void Add()
        {
            Console.WriteLine("添加叶子节点");
        }

        public override void Operation()
        {
            Console.WriteLine(name);
            foreach(Component c in components)
            {
                c.Operation();
            }
        }

        public void Remove()
        {
            Console.WriteLine("移除叶子节点");
        }

        protected  List<Component> GetChild()
        {
            Console.WriteLine("返回所有叶子节点");

            return null;
        }
    }

总结:安全方式组合,抽象构建中只声明所有构建中(叶子构建)都有的属性和方法,单个构建(容器构建)所特有的属性和方法则直接在该类中声明并实现。

ps:组合模式中所有构建都继承抽象构建

  • 23
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值