组合模式

本文深入探讨了组合模式的设计理念,展示了如何通过树形结构表示部分-整体的层次关系,使用户能够一致地处理单个对象和组合对象。文章对比了透明式和安全式组合模式的不同实现方式,以及各自的优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介:

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

       可用来处理一类具有“容器特征”的对象,即它们在充当对象的同时,又可以作为容器包含其他多个对象。例如文件夹。

 

介绍:

组合模式结构

 

特征
优点

1.客户端代码可以一致地处理对象和对象容器,无需区别是单个还是组合对象。

2.客户代码与对象容器解耦。

3.安全式的组合模式易于扩展组合对象。

缺点1.其叶子和树枝的声明都是实现类,而不是接口,违反了“依赖倒置原则”。
特点 

1.组合对象可以组合,类似递归。

2.简单对象和复合对象必须实现相同的接口

角色
抽象构件角色(Component)

对象的公共接口。在安全式的组合模式中,抽象构件不包含管理组合对象的接口,而是构件提供。

树叶构件角色(Leaf)下面没有子对象,可以理解为无子节点。
树枝构件角色(Composite)

包含所有下级子对象的对象

 

使用:

本案例的意思是对线和多边形的添加、删除、画操作。

1.透明式

    //Component
    public abstract class Shape
    {
        public abstract void Add(Shape shape);
        public abstract void Remove(Shape shape);
        public abstract void Draw();
    }

    //Leaf
    public sealed class Line : Shape
    {
        public override void Add(Shape shape)
        {
            throw new Exception("error");
        }
        public override void Remove(Shape shape)
        {
            throw new Exception("error");
        }
        public override void Draw()
        {
            //do something
        }
    }

    //Composite
    public sealed class Polygon : Shape
    {
        public override void Add(Shape shape)
        {
            //do something
        }
        public override void Remove(Shape shape)
        {
            //do something
        }
        public override void Draw()
        {
            //do something
        }
    }
            //组合模式调用 - 透明
            Shape shapeL = new Line();
            shapeL.Add(new Polygon());    //error
            shapeL.Remove(new Polygon()); //error
            shapeL.Draw();

            Shape shapeP = new Polygon();
            shapeP.Add(new Polygon());
            shapeP.Remove(new Polygon());
            shapeP.Draw();

 

2.安全式

    //Component
    public abstract class Shape
    {
        public abstract void Draw();
    }
    
    //Leaf
    public sealed class Line : Shape
    {

        public override void Draw()
        {
            //do something
        }
    }

    //Composite
    public abstract class IPolygon : Shape
    {
        public abstract void Add(Shape shape);
        public abstract void Remove(Shape shape);
        public override void Draw()
        {
            //do something
        }
    }


    public sealed class Polygon : IPolygon
    {
        public override void Add(Shape shape)
        {
            //do something
        }
        public override void Remove(Shape shape)
        {
            //do something
        }
        public override void Draw()
        {
            //do something
        }
    }
            //组合模式调用 - 安全
            Shape shapeL = new Line();
            shapeL.Draw();

            Shape shapeP = new Polygon();
            shapeP.Draw();
            ((Polygon)shapeP).Add(new Polygon());
            ((Polygon)shapeP).Remove(new Polygon());

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值