在軟件開發中,經常需要處理「部分-整體」的樹形結構:如文件系統(文件/文件夾)、UI 控件樹、圖形編輯器(基本圖形/復合圖形)。客戶端希望統一介面操作單個對象與組合對象,避免充斥 if (isLeaf) ... else ... 的分支判斷。組合模式正是為此而生。
組合模式允許你將對象組合成樹形結構來表現「部分-整體」的層次結構,使得客戶以一致的方式處理單個對象以及對象的組合。
關鍵在於:葉子節點與容器節點實現相同的抽象介面(Component)。
在抽象基類 Component 中聲明 Add/Remove/GetChild 等管理方法。葉子類繼承後拋出異常或空實現。
僅在容器類 Composite 中聲明管理方法,葉子類 Leaf 不包含這些方法。
// 抽象構件
public abstract class Graphics {
public string Name { get; set; }
public Graphics(string name) { Name = name; }
public abstract void Draw();
public abstract void Add(Graphics g);
public abstract void Remove(Graphics g);
}
// 葉子:直線
public class Line : Graphics {
public Line(string name) : base(name) { }
public override void Draw() => Console.WriteLine("畫 " + Name);
public override void Add(Graphics g) => throw new Exception("不能向簡單圖形添加");
public override void Remove(Graphics g) => throw new Exception("不能向簡單圖形移除");
}
// 葉子:圓
public class Circle : Graphics { /* 類似 Line */ }
// 容器:復雜圖形
public class ComplexGraphics : Graphics {
private List children = new List();
public ComplexGraphics(string name) : base(name) { }
public override void Draw() => children.ForEach(g => g.Draw());
public override void Add(Graphics g) => children.Add(g);
public override void Remove(Graphics g) => children.Remove(g);
}
// 抽象構件:移除管理方法
public abstract class Graphics {
public string Name { get; set; }
public Graphics(string name) { Name = name; }
public abstract void Draw();
}
// 葉子:無 Add/Remove
public class Line : Graphics { /* ... */ }
public class Circle : Graphics { /* ... */ }
// 容器:擁有管理方法
public class ComplexGraphics : Graphics {
private List children = new List();
public void Add(Graphics g) => children.Add(g);
public void Remove(Graphics g) => children.Remove(g);
public override void Draw() => children.ForEach(g => g.Draw());
}
三大角色:
Draw)。Draw 遞歸調用子對象。

| 優點 | 缺點 |
|---|---|
|
|
最佳實踐:
Component 多態調用,避免直接實例化具體葉子類。System.Windows.Forms.Control 正是透明式組合模式的經典應用:Label、TextBox 為葉子;GroupBox、Panel 為容器,均繼承 Control 並實現 OnPaint 遞歸繪製。
組合模式將客戶程序與複雜元素內部結構解耦,使客戶程序能像處理簡單元素一樣處理複雜元素,是構建靈活可擴展樹形結構的利器。