디자인 모드 일 일 연습: 조합 모드 (Composite)

Composite 모드 는 대상 을 '부분 - 전체' 의 계층 구 조 를 나타 내기 위해 트 리 구조 로 조합 한다.Composite 는 사용자 가 하나의 대상 과 조합 대상 에 대한 사용 을 일치 시 킵 니 다.
// component
class FileComponent {
    public:
        virtual ~FileComponent();
        
        virtual int GetSize();
        virtual void Display();
        virtual FileComponent* GetComposite() { return this; }
        
        virtual void Add(FileComponent*);
        virtual void Remove(FileComponent*);
        virtual Iterator<FileComponent*>* CreateIterator();
        
    protected:
        FileComponent(const char* name);
        
    private:
        const char* name;
};

// composite
class FolderComposite: public FileComponent {
    public:
        FolderComposite(const char* name);
        virtual ~FolderComposite();
        
        virtual int GetSize();
        virtual void Display();
        
        virtual void Add(FileComponent*);
        virtual void Remove(FileComponent*);
        virtual List<FileComponent*>* GetFileList();
        
    private:
        List<FileComponent*> fileList;
};

int FolderComposite::GetSize() {
    List<FileComponent*>* itr = fileList->begin();
    int totalSize = 0;
    
    for (; itr != fileList->end(); itr++) {
        totalSize += (*itr)->GetSize();
    }
    
    return totalSize;
}

void Display() {
    printf("d  %s  %d
", name, GetSize()); List<FileComponent*>* itr = fileList->begin(); for (; itr != fileList->end(); itr++) { (*itr)->Display(); } } // leaf class DocumentLeaf: public FileComponent { public: DocumentLeaf(const char* name); virtual ~DocumentLeaf(); virtual int GetSize(); virtual void Display(); virtual FileComponent* GetComposite() { return 0; } }; void DocumentLeaf::Display() { printf("- %s %d
", name, GetSize()); } // test void Test() { FolderComposite* folder1 = new FolderComposite("folder1"); FolderComposite* folder2 = new FolderComposite("folder2"); DocumentLeaf* doc1 = new DocumentLeaf("doc1"); DocumentLeaf* doc2 = new DocumentLeaf("doc2"); DocumentLeaf* doc3 = new DocumentLeaf("doc3"); folder1->Add(doc1); folder1->Add(doc2); folder2->Add(doc3); FolderComposite* rootFolder = new FolderComposite("root"); rootFolder->Add(folder1); rootFolder->Add(folder2); rootFolder->Display(); // todo ... destroy }

    PS. 제 디자인 모델 시리즈 블 로그, 칼럼 은 간단 한 사례 를 통 해 디자인 모델 을 보 여 줌 으로 써 초보 자 들 에 게 쉽게 이해 할 수 있 습 니 다.깊이 공부 하려 면 GoF 의 을 보십시오.

좋은 웹페이지 즐겨찾기