设计模式-结构型03-组合模式

来源:互联网 发布:php文件管理器源码 编辑:程序博客网 时间:2024/06/08 15:00

一,动机

在Windows文件系统中,存在着如图的文件目录结构。其中有文件和文件夹两种对象,而文件夹中包含子文件夹,也可以包含有文件。


对于这种需要包含自身对象结构,组合模式描叙了如何将容器对象和叶子对象进行递归组合,使得用户在使用时无须对它们区分,可以一致的对待容器对象和叶子对象,这就是组合模式的动机


二,定义

组合模式:组合多个对象形成树形结构以表示“整体-部分”的结构层次。

组合模式对单个对象(叶子)和组合对象(容器)的使用具有一致性。


三,模式结构


1,Component(抽象构件)

为叶子以及容器对象声明接口,定义访问以及管理它的子构件的方法。


2,Leaf(叶子构件)

表示叶子节点对象,实现抽象构件定义的行为


3,Composite(容器构件)

表示容器对象,提供一个集合用于存储子节点。


4,Client(客户类)

通过抽象构件的借口来访问控制组合构件的对象


四,代码实例


下面是对文件夹组合模式的代码示例

#include <iostream>#include <list>using namespace std;class AbsFile{public:    virtual void display() = 0;    string GetFileName()    {        return filename ;    }    void   SetFileName(string tmp)    {        filename = tmp ;    }protected:    string filename;};class ImageFile : public AbsFile{public:    ImageFile(string tmp = NULL)    {        filename = tmp;    }    void display()    {        cout<<"这是一幅好看的图片"<<"::"<<filename<<endl;    }};class TextFile:public AbsFile{public:    TextFile(string tmp = NULL)    {        filename = tmp;    }    void display()    {        cout<<"这是一首诗歌"<<"::"<<filename<<endl;    }};class Folder :public AbsFile{public:    Folder(string tmp =NULL)    {        filename = tmp;    }    void display()    {        cout<<"这是一个文件夹"<<"::"<<filename<<",拥有如下文件 :"<<endl;        list<AbsFile*>::iterator its;        for(its= fileList.begin();its != fileList.end(); its ++)        {            (*its)->display();        }    }    void Add(AbsFile* tmp)    {        fileList.push_back(tmp);    }    void Remove(string fname)    {        list<AbsFile*>::iterator its;        for(its= fileList.begin();its != fileList.end(); its ++)        {            if((*its)->GetFileName() == fname)            {                fileList.erase(its);            }        }    }private:    list<AbsFile*> fileList;};int main(){    Folder* f1 = new Folder("folder1");    f1->Add(new ImageFile("Image1"));    f1->Add(new TextFile("Text1"));    Folder* f2 = new Folder("folder2");    f2->Add(new TextFile("Text21"));    f1->Add(f2);    Folder* f3 = new Folder("folder3");    f3->Add(new ImageFile("Image31"));    f2->Add(f3);    f1->display();    return 0;}



0 0
原创粉丝点击