【C#设计模式-组合模式】

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

二.组合模式经典案例:系统目录结构,网站导航结构等

结构:

【C#设计模式-组合模式】_第1张图片

1.Component 是组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理Component子部件。
2.Leaf 在组合中表示叶子结点对象,叶子结点没有子结点。
3.Composite 定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关操作,如增加(add)和删除(remove)等。

三.实现代码:通过生活中画图形的案例,复杂图形的画法来自但个图形的组合。

    /// 
    /// 图形抽象类
    /// 
    public abstract class Graphics
    {
        public string Name { get; set; }
        public Graphics(string Name)
        {
            this.Name = Name;
        }
        public abstract void Draw();
        public abstract void Add(Graphics g);
        public abstract void Remove(Graphics g);
    }
/// 
    /// 单一图形线段
    /// 
    public class Line:Graphics
    {
        public Line(string Name):base(Name){ }
        
        public override void Draw()
        {
            Console.WriteLine("画" + this.Name);
        }
        public override void Add(Graphics g)
        {
            throw new Exception("不能向单图形Line中添加其他的图像");
        }
        public override void Remove(Graphics g)
        {
            throw new Exception("不能向单图形Line中移除其他图像");
        }
    }
    /// 
    /// 单一图形圆
    /// 
    public class Circle:Graphics
    {
        public Circle(string Name) : base(Name) { }
        public override void Draw()
        {
            Console.WriteLine("画"+this.Name);
        }
        public override void Add(Graphics g)
        {
            throw new Exception("不能向单一图形圆中添加其他的图像");
        }
        public override void Remove(Graphics g)
        {
            throw new Exception("不能向单一图形圆中移除其他的图像");
        }
    }
    /// 
    /// 复杂图形,由简单图形组合而成
    /// 
    public class ComplexGraphics:Graphics
    {
        public List complexgraphics = new List();
        public ComplexGraphics(string name) : base(name) { }
        public override void Draw()
        {
            foreach (Graphics item in complexgraphics)
            {
                item.Draw();
            }
        }
        public override void Add(Graphics g)
        {
            complexgraphics.Add(g);   
        }
        public override void Remove(Graphics g)
        {
            complexgraphics.Remove(g);
        }
    }
    /// 
    /// C#设计模式组合模式-透明式的组合模式
    /// 
    class Program
    {
        static void Main(string[] args)
        {
            ComplexGraphics g = new ComplexGraphics("两条线段组成的复杂图形");
            Console.WriteLine("画复杂图形");
            g.Add(new Line("线段一"));
            Line l = new Line("线段二");
            g.Add(l);
            g.Draw();
            Console.WriteLine("移除线段二");
            g.Remove(l);
            g.Draw();
        }
    }
【C#设计模式-组合模式】_第2张图片

上面的方式使用的是透明组合描述,复杂图形和简单图形都继承自Graphish抽象类,实现了里面的方法,而简单图形是不需要Add和Remove方法的,使用透明组合模式,只能够是直接通过抛出一个异常的方式来解决这样的问题的,其实可以使用安全式的组合模式来避免上诉问题,Graphish只抽象画的方法,后面的简单图形继承,实现画的方法,而复杂图形继承后,实现画的方方,同时新增Add和Remove方法,这样简单图形中就不用采取抛出异常的方式解决问题。修改后关系图如下:

【C#设计模式-组合模式】_第3张图片

涉及角色:
1.Component 是组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理Component子部件。
2.Leaf 在组合中表示叶子结点对象,叶子结点没有子结点。
3.Composite 定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关操作,如增加(add)和删除(remove)等。

适用性
1.想表示对象的部分-整体层次结构
2.希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。


你可能感兴趣的:([05],设计模式,C#设计模式)