文章出處

/// 安全式的組合模式
    /// 此方式實現的組合模式把管理子對象的方法聲明在樹枝構件ComplexGraphics類中
    /// 這樣如果葉子節點Line、Circle使用了Add或Remove方法時,就能在編譯期間出現錯誤
    /// 但這種方式雖然解決了透明式組合模式的問題,但是它使得葉子節點和樹枝構件具有不一樣的接口。
    /// 所以這兩種方式實現的組合模式各有優缺點,具體使用哪個,可以根據問題的實際情況而定
    class Client
    {
        static void Main(string[] args)
        {
            ComplexGraphics complexGraphics = new ComplexGraphics("一個復雜圖形和兩條線段組成的復雜圖形");
            complexGraphics.Add(new Line("線段A"));
            ComplexGraphics CompositeCG = new ComplexGraphics("一個圓和一條線組成的復雜圖形");
            CompositeCG.Add(new Circle(""));
            CompositeCG.Add(new Circle("線段B"));
            complexGraphics.Add(CompositeCG);
            Line l = new Line("線段C");
            complexGraphics.Add(l);

            // 顯示復雜圖形的畫法
            Console.WriteLine("復雜圖形的繪制如下:");
            Console.WriteLine("---------------------");
            complexGraphics.Draw();
            Console.WriteLine("復雜圖形繪制完成");
            Console.WriteLine("---------------------");
            Console.WriteLine();

            // 移除一個組件再顯示復雜圖形的畫法
            complexGraphics.Remove(l);
            Console.WriteLine("移除線段C后,復雜圖形的繪制如下:");
            Console.WriteLine("---------------------");
            complexGraphics.Draw();
            Console.WriteLine("復雜圖形繪制完成");
            Console.WriteLine("---------------------");
            Console.Read();
        }
    }

    /// <summary>
    /// 圖形抽象類,
    /// </summary>
    public abstract class Graphics
    {
        public string Name { get; set; }
        public Graphics(string name)
        {
            this.Name = name;
        }

        public abstract void Draw();
        // 移除了Add和Remove方法
        // 把管理子對象的方法放到了ComplexGraphics類中進行管理
        // 因為這些方法只在復雜圖形中才有意義
    }

    /// <summary>
    /// 簡單圖形類——線
    /// </summary>
    public class Line : Graphics
    {
        public Line(string name)
            : base(name)
        { }

        // 重寫父類抽象方法
        public override void Draw()
        {
            Console.WriteLine("" + Name);
        }
    }

    /// <summary>
    /// 簡單圖形類——圓
    /// </summary>
    public class Circle : Graphics
    {
        public Circle(string name)
            : base(name)
        { }

        // 重寫父類抽象方法
        public override void Draw()
        {
            Console.WriteLine("" + Name);
        }
    }

    /// <summary>
    /// 復雜圖形,由一些簡單圖形組成,這里假設該復雜圖形由一個圓兩條線組成的復雜圖形
    /// </summary>
    public class ComplexGraphics : Graphics
    {
        private List<Graphics> complexGraphicsList = new List<Graphics>();
        public ComplexGraphics(string name)
            : base(name)
        { }

        /// <summary>
        /// 復雜圖形的畫法
        /// </summary>
        public override void Draw()
        {
            foreach (Graphics g in complexGraphicsList)
            {
                g.Draw();
            }
        }

        public void Add(Graphics g)
        {
            complexGraphicsList.Add(g);
        }
        public void Remove(Graphics g)
        {
            complexGraphicsList.Remove(g);
        }
    }

 

 

四、組合模式的使用場景

在以下情況下應該考慮使用組合模式:

  1. 需要表示一個對象整體或部分的層次結構。
  2. 希望用戶忽略組合對象與單個對象的不同,用戶將統一地使用組合結構中的所有對象。

文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()