组合模式

组合模式:见名知意,将不同对象组合起来为一个整体使用,组合的好的整体可以继续组合,作为一个新的整体使用。

动机(Motivate):
    组合模式有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。

代码案例:绘图的时候,有许多基本图形,也有由基本图形组合成的符合图形,如果每次我们复合一张图的时候总是每次都是从基本图形一点点凑成,而不是使用现成的复合图形的话,那代码将是十分糟糕的,组合模式的出现,为我们提供了一个良好的解决方案,他可以将复合图形作为一个我们可使用的'基本图形',由我们进行拼接。

 

 

  #region 抽象图像类
    public abstract class Graphics
    {
        protected string _name;
        public Graphics(string name)
        {
            _name = name;
        }
        public abstract void Draw();
    }
    #endregion
  #region 基本图像类
    public class Line : Graphics
    {
        public Line(string name) : base(name)
        {
            
        }

        public override void Draw()
        {
            Console.WriteLine("绘制line");
        }
    }
    public class Circle : Graphics
    {
        public Circle(string name) : base(name)
        {
        }

        public override void Draw()
        {
            Console.WriteLine("绘制circle");
        }
    }
    #endregion
 #region 复合图片类
    public class Picture : Graphics
    {
        private ArrayList arr = new ArrayList();
        public Picture(string name) : base(name)
        {
        }
        public void Add(Graphics g)
        {
            arr.Add(g);
        }
        public void Remove(Graphics g)
        {
            arr.Remove(g);
        }
        public override void Draw()
        {
            foreach (Graphics item in arr)
            {
                item.Draw();
            }
        }
    }
    #endregion
  static void Main(string[] args)
        {
            Line line = new Line("细线");
            Circle circle = new Circle("");
            Picture pic1 = new Picture("复合图像1");//创建复合图像使用类
            pic1.Add(line);
            pic1.Add(circle);

            Picture pircture = new Picture("绘图");
            pircture.Add(pic1);//使用复合图像与基本图像都是相同的
            pircture.Add(pic1);
            pircture.Add(line);
            pircture.Draw();

            Console.ReadKey();
        }

 上方代码有一个问题就是虽然基本图像类与复合图形类继承的接口相同,但是具体实现的ArrayList的Add与Remove只在Picture图形类中,这样出现了内部不统一

还有一个写法就是,将ArrayLis与其对应的Add与Remove写在抽象类中,这样继承的类内部保持了统一,但是基本图像是不需要这些方法的,实现的时候抛异常即可。

相比而下,正常还是上方的写法比较好,比较简明清晰;具体选择什么,也需要根据具体情况,具体选择。

posted @ 2020-01-17 07:34  程序杰杰  阅读(224)  评论(0编辑  收藏  举报