Composite Pattern(組合模式)是一種結構型設計模式,旨在將對象組織成樹狀結構,使客戶端對單個對象和組合對象的處理方式保持一致。

Composite Pattern的四個要素:

四個要素的簡單介紹如下:

  1. 模式名稱

Composite Pattern(組合模式)

  1. 問題

需要以一致的方式處理單個對象和組合對象,並在不同層級結構中運行操作。

  1. 解決方案

使用組合模式將對象組織成樹狀結構,其中包含兩種類型的對象:葉子對象和容器對象。葉子對象表示結構的最終節點,而容器對象可以包含子對象,並對子對象進行相同的操作。

  1. 結果

組合模式使得客戶端可以對整個結構或單個對象進行統一的操作,同時也可以輕鬆地添加新的對象類型,擴展結構。

在C#中,可以通過以下方式進行Composite Pattern的實作:

建立組合對象的基本抽象類(Component):

public abstract class Component
{
    protected string name;

    public Component(string name)
    {
        this.name = name;
    }

    public abstract void Operation();
}

建立葉子對象(Leaf)繼承自Component:

public class Leaf : Component
{
    public Leaf(string name) : base(name)
    {
    }

    public override void Operation()
    {
        Console.WriteLine($"Leaf {name} is performing operation.");
    }
}

建立容器對象(Composite)繼承自Component,並包含子對象的集合:

public class Composite : Component
{
    private List<Component> components;

    public Composite(string name) : base(name)
    {
        components = new List<Component>();
    }

    public void Add(Component component)
    {
        components.Add(component);
    }

    public void Remove(Component component)
    {
        components.Remove(component);
    }

    public override void Operation()
    {
        Console.WriteLine($"Composite {name} is performing operation.");
        
        foreach (var component in components)
        {
            component.Operation();
        }
    }
}

測試程式碼:

class Program
{
    static void Main(string[] args)
    {
        // 初始化葉子對象
        var leaf1 = new Leaf("Leaf 1");
        var leaf2 = new Leaf("Leaf 2");
        var leaf3 = new Leaf("Leaf 3");

        // 初始化容器對象
        var composite1 = new Composite("Composite 1");
        var composite2 = new Composite("Composite 2");


        // 將葉子對象添加到容器中
        composite1.Add(leaf1);
        composite1.Add(leaf2);
        composite2.Add(leaf3);

        // 將容器對象添加到容器中,形成結構
        composite1.Add(composite2);

        // 執行操作
        composite1.Operation();

        /*
         * 輸出結果:
         * Composite Composite 1 is performing operation.
         * Leaf Leaf 1 is performing operation.
         * Leaf Leaf 2 is performing operation.
         * Composite Composite 2 is performing operation.
         * Leaf Leaf 3 is performing operation.
         */

        Console.ReadLine();
    }
}

以上程式碼中,我們建立了葉子對象(Leaf)和容器對象(Composite),並通過添加和移除的方式構建了一個結構。 最後,我們調用容器對象的Operation方法,該方法遞歸地調用了所有子對象的Operation方法,實現了一致的操作。

這是Composite Pattern在C#中的基本實現方式。藉助Composite Pattern,您可以方便地處理具有層次結構的對象,同時保持操作的一致性。