所有構件類別(無論葉節點/合成節點)**均符合固定介面**,包含 Add/Remove/GetChild 等管理方法。

| 角色 | 說明 |
|---|---|
| 抽象構件 | 定義共同介面與預設行為,含管理子物件方法 |
| 葉構件 | 實作基本行為;管理方法給出「平庸實作」(拋出異常/忽略) |
| 合成構件 | 實作管理方法與遞歸行為 |
using System;
using System.Text;
using System.Collections;
abstract class Component
{
protected string name;
public Component(string name) => this.name = name;
public abstract void Add(Component c);
public abstract void Remove(Component c);
public abstract void Display(int depth);
}
class Composite : Component
{
private ArrayList children = new ArrayList();
public Composite(string name) : base(name) { }
public override void Add(Component c) => children.Add(c);
public override void Remove(Component c) => children.Remove(c);
public override void Display(int depth)
{
Console.WriteLine(new string('-', depth) + name);
foreach (Component c in children) c.Display(depth + 2);
}
}
class Leaf : Component
{
public Leaf(string name) : base(name) { }
public override void Add(Component c)
=> Console.WriteLine("Cannot add to a leaf");
public override void Remove(Component c)
=> Console.WriteLine("Cannot remove from a leaf");
public override void Display(int depth)
=> Console.WriteLine(new string('-', depth) + name);
}
public class Client
{
public static void Main()
{
Composite root = new Composite("root");
root.Add(new Leaf("Leaf A"));
root.Add(new Leaf("Leaf B"));
Composite comp = new Composite("Composite X");
comp.Add(new Leaf("Leaf XA"));
comp.Add(new Leaf("Leaf XB"));
root.Add(comp);
root.Add(new Leaf("Leaf C"));
Leaf l = new Leaf("Leaf D");
root.Add(l);
root.Remove(l);
root.Display(1);
}
}
| 維度 | 透明式 | 安全式 |
|---|---|---|
| 介面一致性 | 完全一致 | 葉節點無管理方法 |
| 客戶端調用 | 無需區分類型 | 需型別檢查或捕獲異常 |
| 葉節點安全性 | 運行時錯誤/忽略 | 編譯時保證 |
| 適用場景 | 客戶端不區分葉/合成 | 需嚴格防止誤調用 |
IComponent + IComposite : IComponent 實現編譯時安全與介面統一並存