定义:将对象组合成树形结构以表示“部分整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
组成:
以一个文件结构为例。
每一个文件或者目录都可以看作一个节点,而对于目录节点又有添加删除子节点的操作。
首先定义一个抽象基类节点。
class Node { public: virtual void Add(Node* tmp)=0; virtual void Remove()=0; virtual void Display(string str)=0; };
对于文件节点,没有添加删除操作。
class File : public Node { private: string Name; void Add(Node* c){} void Remove(){} public: File(string name) { Name = name; } void Display(string str) { string strtmp = str + Name; cout<<strtmp<<endl; } };
对于文件夹,可以用一个链表来存储其子文件夹和文件
class DirFolder :public Node { private: list<Node*> subfolder; string Name; public: int length = 0; DirFolder(string name) { Name = name; } void Add(Node* tmp) { length = length + 1; subfolder.push_back(tmp); } void Remove() { if (length == 0) return; length = length - 1; subfolder.pop_back(); } void Display(string str) { cout<<str<<Name<<endl; str = str + "---"; for (Node* component:subfolder) { component->Display(str); } } };
测试:
int main() { DirFolder root("root"); //添加文件 File* file1=new File("file1"); root.Add(file1); //添加子文件夹 File* file2=new File("file2"); root.Add(file2); //添加文件 DirFolder* subdir=new DirFolder("subdir"); File* file3=new File("file3"); subdir->Add(file3); File* file4=new File("file4"); subdir->Add(file4); //删除子文件夹 root.Add(subdir); root.Display(""); root.Remove(); root.Display(""); return 0; }
整体与部分需要被一致对待时。
原文地址:http://blog.csdn.net/zsp_skyer/article/details/38315047