设计模式一日一练:组合模式(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\n", 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\n", 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. 我的设计模式系列blog,《设计模式》专栏,通过简单的示例演示设计模式,对于初学者很容易理解入门。深入学习请看GoF的《设计模式》。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值