2018년 11월 9일 금요일

C++ 디자인패턴 (Composite Pattern)

Composite Pattern
클라이언트에서 단일 객체와 복합 객체 모두 동일하게 다루기 위해 사용하는 디자인 패턴
#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 또한 담을 수 있는데 다형성을 이용해 관리해준다.

댓글 없음:

댓글 쓰기