首頁 » 設計模式 » 組合(Composite)

組合(Composite)

作者:

分類:

組合(Composite)

概念

組合模式是一種結構型模式,目的是將物件組合成樹狀的結構,透過分層的方式可以容易理解物件之間的階層關聯。讓Composite與Leaf共同繼承相同介面Component,差別在於Composite還多實作了容器的功能,讓自己可以容下其他Composite、Leaf。

範例

//**************
//* author: cian
//* 20231031
//**************

/* Component */
interface IComponent
{
    void Operation();
}

/* Leaf */
class Leaf : IComponent
{
    private int id;
    public Leaf(int _id) { id = _id; }
    public void Operation()
    {
        Console.WriteLine($"Leaf{id}");
    }
}

/* Composite */
class Composite : IComponent
{
    private List<IComponent> items = new List<IComponent>();
    private int id;
    public Composite(int _id) { id = _id; }
    
    public void Operation()
    {
        Console.WriteLine($"Composite{id}");
        foreach(var item in items)
        {
            item.Operation();
        }
    }
    
    public void Add(IComponent item)
    {
        items.Add(item);
    }
    
    public void Remove(IComponent item)
    {
        items.Remove(item);
    }
}

class MainApp
{
    static void Main(string[] args)
    {
        Composite composite = new Composite(0); //Composite 0 as root
        composite.Add(new Leaf(1));
        composite.Add(new Leaf(2));
        
        Composite composite1 = new Composite(1); //Composite 1
        composite.Add(composite1); //add Composite1.
        composite1.Add(new Leaf(3));
        composite1.Add(new Leaf(4));
        
        composite.Operation();
    }
}

結語

網路上有些範例會將IComponent實作Add&Remove,差別在Leaf類別再實作空方法即可。這裡只提供Operation接口,主要是在物件的關聯只有Operation,所以就不幫Leaf實作Add&Remove。

如果要將架構更固定的話,自己會再另外寫Abstract class去維護。理論上沒有對錯,就看如何實際應用了。

以上為學習過程的問題紀錄
如果文章有誤,歡迎前輩留言請不吝指教。

「cian」的個人頭像

留言

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *