將對象組合成樹形結構以表示「部分-整體」層次,使客戶端對單個對象和組合對象的使用具有一致性。
Operation, Add, Remove, GetChild),可提供默認實現。Operation,Add/Remove 拋異常或空實現。Add/Remove/GetChild,Operation 遞歸調用子節點。Component 聲明所有管理方法(Add/Remove)。Leaf 也擁有這些方法(空實現/拋異常)。客戶端完全統一調用,但 Leaf 調用管理方法不安全。Composite 聲明管理方法。客戶端需區分 Leaf/Composite,失去透明性但類型安全。class Component {
string name;
public:
Component(string n):name(n){}
virtual ~Component(){}
virtual void Operation()=0;
virtual void Add(Component*)=0;
virtual void Remove(Component*)=0;
virtual Component* GetChild(int)=0;
string GetName() { return name; }
virtual void Print()=0;
};
class Leaf : public Component {
public:
Leaf(string n):Component(n){}
void Operation() { cout<<"Leaf: "< children;
public:
Composite(string n):Component(n){}
~Composite() { for(auto c:children) delete c; }
void Operation() {
cout<<"Composite: "<Operation();
}
void Add(Component* c) { children.push_back(c); }
void Remove(Component* c) {
auto it=find(children.begin(),children.end(),c);
if(it!=children.end()) { delete *it; children.erase(it); }
}
Component* GetChild(int i) { return (i>=0&&iGetName()<
Composite 析構函數遞歸刪除子節點,客戶端無需手動管理。vector 存儲子節點,支援動態增刪。Component 盡可能多定義公共操作,Leaf/Composite 選擇性重寫。組合模式以遞歸結構優雅解決「部分-整體」問題。關鍵在於 Component 接口設計(透明/安全權衡)與 Composite 的遞歸委派。掌握後,樹形結構操作變得極其簡潔統一。