복합 패턴은 단일 개체와 유사한 방식으로 개체 그룹을 처리해야 하는 경우에 사용됩니다. 복합 패턴은 전체 계층뿐만 아니라 부분을 나타내는 트리 구조의 관점에서 개체를 구성합니다. 이러한 유형의 디자인 패턴은 이 패턴이 개체 그룹의 트리 구조를 생성하므로 구조적 패턴에 속합니다.
이 패턴은 자체 개체 그룹을 포함하는 클래스를 만듭니다. 이 클래스는 동일한 개체 그룹을 수정하는 방법을 제공합니다.
우리는 조직의 직원 계층을 보여줄 다음 예를 통해 복합 패턴의 사용을 보여주고 있습니다.

여기에서 합성 및 리프 두 클래스가 구성 요소를 구현하는 것을 볼 수 있습니다. 중요한 부분은 합성 클래스이며 이는 합성 관계로 표시되는 구성 요소 개체도 포함합니다.
예시 코드
#include <iostream>
#include <vector>
using namespace std;
class PageObject {
public:
virtual void addItem(PageObject a) { }
virtual void removeItem() { }
virtual void deleteItem(PageObject a) { }
};
class Page : public PageObject {
public:
void addItem(PageObject a) {
cout << "Item added into the page" << endl;
}
void removeItem() {
cout << "Item Removed from page" << endl;
}
void deleteItem(PageObject a) {
cout << "Item Deleted from Page" << endl;
}
};
class Copy : public PageObject {
vector<PageObject> copyPages;
public:
void AddElement(PageObject a) {
copyPages.push_back(a);
}
void addItem(PageObject a) {
cout << "Item added to the copy" << endl;
}
void removeItem() {
cout << "Item removed from the copy" << endl;
}
void deleteItem(PageObject a) {
cout << "Item deleted from the copy";
}
};
int main() {
Page p1;
Page p2;
Copy myCopy;
myCopy.AddElement(p1);
myCopy.AddElement(p2);
myCopy.addItem(p1);
p1.addItem(p2);
myCopy.removeItem();
p2.removeItem();
} 출력
Item added to the copy Item added into the page Item removed from the copy Item Removed from page