vlambda博客
学习文章列表

C#设计模式——组合模式

This browser does not support music or audio playback. Please play it in WeChat or another browser.
C#设计模式——组合模式


我希望未来有一天,因为我的代码,让这个世界上的一些人生活的更便利
感觉到一点点幸福或愉悦。不管这些人多还是少。

前言


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

C#设计模式——组合模式
C#设计模式——组合模式

方案思路


组合模式需要以下3个模块:

组合部件(Component):它是一个抽象角色,为要组合的对象提供统一的接口

叶子(Leaf):在组合中表示子节点对象,叶子节点不能有子节点。

合成部件(Composite):定义有枝节点的行为,用来存储部件,实现在Component接口中的有关操作,如增加(Add)和删除(Remove)。

另外组合模式有两种组合方式,一种是透明组合,另一种是安全组合

下面的示例中使用了透明组合,如果需要换成安全组合只需在抽象类里面讲add,remove方法删掉,再到composite类里面专门写上。

C#设计模式——组合模式
C#设计模式——组合模式

Code



C#设计模式——组合模式

以下代码经过测试,可直接在项目中使用

/// <summary>

/// 测试类

/// </summary>

public class CompositeTest : MonoBehaviour

{

    void Start()

    {

        Line line = new Line("线");

        Circle circle = new Circle("圆");

        line.Draw();

        circle.Draw();


        ComplexDrawing complexDrawing = new ComplexDrawing("复合图形:圆与线");

        complexDrawing.Add(new Line("线"));

        complexDrawing.Add(new Circle("圆"));

        complexDrawing.Draw();

    }

}

 /// <summary>

 /// 图像抽象类:Component

 /// </summary>

public abstract class Drawing

{

    protected string Name;

    public Drawing(string name)

    {

        this.Name = name;

    }

    public abstract void Add(Drawing drawing);

    public abstract void Remove(Drawing drawing);


    public abstract void Draw();

}

/// <summary>

/// 单个图像_线:Leaf

/// </summary>

public class Line : Drawing

{

    public Line(string name) : base(name)

    {

    }

    public override void Add(Drawing drawing)

    {

        throw new Exception("不能向简单图形Line添加其他图形");

    }

    public override void Remove(Drawing drawing)

    {

        throw new System.NotImplementedException("不能向简单图形Line移除其他图形");

    }

    public override void Draw()

    {

        Debug.Log("画一个"+Name);

    }

}

/// <summary>

/// 单个图像_圆:Leaf

/// </summary>

public class Circle : Drawing

{

    public Circle(string name) : base(name)

    {

    }

    public override void Add(Drawing drawing)

    {

        throw new Exception("不能向简单图形Circle添加其他图形");

    }

    public override void Remove(Drawing drawing)

    {

        throw new System.NotImplementedException("不能向简单图形Circle移除其他图形");

    }

    public override void Draw()

    {

        Debug.Log("画一个"+Name);

    }

}

/// <summary>

/// 复合图形:Composite

/// </summary>

public class ComplexDrawing : Drawing

{

    private List<Drawing> LIST_Drawing;


    public ComplexDrawing(string name) : base(name)

    {

        LIST_Drawing = new List<Drawing>();

    }

    public override void Add(Drawing drawing)

    {

        LIST_Drawing.Add(drawing);

    }

    public override void Remove(Drawing drawing)

    {

        LIST_Drawing.Remove(drawing);

    }

    public override void Draw()

    {

        Debug.Log("画一个" + Name);

        foreach (var item in LIST_Drawing)

        {

            item.Draw();

        }

    }

}


输出结果








END




感谢阅读


你知道的越多,你不知道的越多

我是EAST

一个靠互联网苟且偷生的程序员

咱们下期见!





扫描二维码关注我吧