
組合(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去維護。理論上沒有對錯,就看如何實際應用了。
以上為學習過程的問題紀錄
如果文章有誤,歡迎前輩留言請不吝指教。
發佈留言