클라이언트에서 단일 객체와 복합 객체 모두 동일하게 다루기 위해 사용하는 디자인 패턴
#include <bits/stdc++.h>
using namespace std;
class Component {
public:
Component() {}
virtual ~Component() {}
virtual void print(int) = 0;
};
class Directory : public Component{
public:
~Directory() {}
Directory() {}
Directory(string id) :m_id(id) {}
void add(Component *input) {
m_comp.push_back(input);
}
void print(int tap = 0) {
for (int i = 0; i < tap; i++) printf("\t"); // tap
printf("directory : %s\n", m_id.c_str());
for (auto dir : m_comp) {
dir->print(tap + 1);
}
}
private:
vector<Component*> m_comp;
string m_id;
};
class File :public Component {
public:
~File() {}
File() {}
File(string id) :m_id(id) {}
void print(int tap = 0) {
for (int i = 0; i < tap; i++) printf("\t"); // tap
printf("file : %s\n", m_id.c_str());
}
private:
string m_id;
};
int main() {
Directory *dir_engineering = new Directory("Engineering");
Directory *dir_computer_science = new Directory("Computer Science");
Directory *dir_algorithm = new Directory("Algorithm");
Directory *dir_AI = new Directory("AI");
dir_algorithm->add(new File("Binary Search"));
dir_algorithm->add(new File("BFS"));
dir_algorithm->add(new File("Dinic Algorithm"));
dir_computer_science->add(dir_algorithm);
dir_AI->add(new File("Reinforcement Learning"));
dir_AI->add(new File("CNN"));
dir_computer_science->add(dir_AI);
dir_engineering->add(dir_computer_science);
dir_engineering->print();
return 0;
}
| cs |
[출력값]
composite 패턴은 파일 시스템을 예시로 들면 이해하기 쉽다.
directory는 file을 담는것 뿐만 아니라 directory 또한 담을 수 있는데 다형성을 이용해 관리해준다.