组合模式

来源:互联网 发布:vb6数据库实例 贴吧 编辑:程序博客网 时间:2024/06/11 11:00

 对于树形结构,当容器对象(如文件夹)的某一个方法被调用时,将遍历整个树形结构,寻找也包含这个方法的成员对象(可以是容器对象,也可以是叶子对象)

并调用执行,牵一而动百,其中使用了递归调用的机制来对整个结构进行处理。由于容器对象和叶子对象在功能上的区别,在使用这些对象的代码中必须有区别地

对待容器对象和叶子对象,而实际上大多数情况下我们希望一致地处理它们,因为对于这些对象的区别对待将会使得程序非常复杂。组合模式为解决此类问题而诞生

,它可以让叶子对象和容器对象的使用具有一致性。


      组合模式定义如下:
组合模式(Composite Pattern):组合多个对象形成树形结构以表示具有“整体—部分”关系的层次结构。组合模式对单个对象(即叶子对象)和组合对象(即容器对象)

的使用具有一致性,组合模式又可以称为“整体—部分”(Part-Whole)模式,它是一种对象结构型模式。


#include <iostream>#include <string>#include <list>using namespace std;class AbstractFile{public:    AbstractFile(const string&s=string("AbstractFile")){        m_name=s;    }    //    virtual string setName(const string&s){m_name=s;}    virtual void add(AbstractFile *file){        cout<<"不支持该操作"<<endl;    }    virtual void remove(AbstractFile *file){        cout<<"不支持该操作"<<endl;    }    virtual  void killVrius(){cout<<m_typestr<<" "<<m_name<<" "<<string("杀毒完成")<<endl;}    string m_name,m_typestr;};//ImageFileclass ImageFile:public AbstractFile{public:    ImageFile(const string& s=string("ImageFile")){        m_name=s;        m_typestr=string("ImageFile");    }};//TextFileclass TextFile:public AbstractFile{public:    TextFile(const string&s=string("TextFile")){        m_name=s;        m_typestr=string("TextFile");    }};//Folderclass Folder:public AbstractFile{public:    Folder(const string&s=string("Folder")){        m_name=s;        m_typestr=string("Floder");    }    void add(AbstractFile *file){        abFileList.push_back(file);    }    void remove(AbstractFile *file){        abFileList.remove(file);    }    void killVrius(){        for(list<AbstractFile*>::iterator it=abFileList.begin();            it!=abFileList.end();++it)        {            AbstractFile *ab=*it;            if(ab!=NULL)                ab->killVrius();        }    }private:    list<AbstractFile*> abFileList;};int main(){    ImageFile *if1=new ImageFile("meitu");    ImageFile *if2=new ImageFile("aaaa");    TextFile *tf1=new TextFile("stl.txt");    TextFile*tf2=new TextFile("csgo.txt");    Folder *fd1=new Folder("home");    Folder *fd2=new Folder("baby");    Folder *fd3=new Folder("study");    fd2->add(if1);    fd2->add(if2);    fd3->add(tf1);    fd3->add(tf2);    fd1->add(fd2);    fd1->add(fd3);    fd1->killVrius();    return 0;}