將物件組合成樹形結構以表示「部分-整體」的層次結構。Composite 使得用戶對單個物件和組合物件的使用具有一致性。

Operation() 及子物件管理介面 Add/Remove/GetChild(預設空實作)。Operation(),Add/Remove 拋出異常或忽略。std::list<Component*>),Operation() 遞迴呼叫所有子物件。Component*,無需區分葉節點或容器。#ifndef COMPOSITE_H
#define COMPOSITE_H
#include <list>
class Component {
public:
Component() {}
virtual ~Component() {}
virtual void Operation() = 0;
virtual void Add(Component* pChild) {}
virtual void Remove(Component* pChild) {}
virtual Component* GetChild(int nIndex) { return nullptr; }
};
class Leaf : public Component {
public:
Leaf() {}
virtual ~Leaf() {}
virtual void Operation();
};
class Composite : public Component {
public:
Composite() {}
virtual ~Composite();
virtual void Operation();
virtual void Add(Component* pChild);
virtual void Remove(Component* pChild);
virtual Component* GetChild(int nIndex);
private:
std::list<Component*> m_ListOfComponent;
};
#endif
#include "Composite.h"
#include <iostream>
#include <algorithm>
void Leaf::Operation() { std::cout << "Operation by leaf\n"; }
Composite::~Composite() {
for (auto p : m_ListOfComponent) delete p;
m_ListOfComponent.clear();
}
void Composite::Add(Component* pChild) { m_ListOfComponent.push_back(pChild); }
void Composite::Remove(Component* pChild) {
auto it = std::find(m_ListOfComponent.begin(), m_ListOfComponent.end(), pChild);
if (it != m_ListOfComponent.end()) m_ListOfComponent.erase(it);
}
Component* Composite::GetChild(int nIndex) {
if (nIndex <= 0 || nIndex > (int)m_ListOfComponent.size()) return nullptr;
auto it = m_ListOfComponent.begin();
std::advance(it, nIndex - 1);
return *it;
}
void Composite::Operation() {
std::cout << "Operation by Composite\n";
for (auto p : m_ListOfComponent) p->Operation(); // 遞迴
}
#include "Composite.h"
#include <cstdlib>
int main() {
Leaf* pLeaf1 = new Leaf();
Leaf* pLeaf2 = new Leaf();
Composite* pComposite = new Composite();
pComposite->Add(pLeaf1);
pComposite->Add(pLeaf2);
pComposite->Operation(); // 整體操作
pComposite->GetChild(2)->Operation(); // 存取單一葉節點
delete pComposite;
return 0;
}
dynamic_cast),較安全但失去透明性。