组合模式
Composite
模式也叫做组合模式,是构造型的设计模式之一。通过递归的手段构造树形的对象结构,并可以通过一个对象来访问整个对象树。
Component
树形结构的节点抽象
为所有的对象定义统一的接口(公共属性,行为等的定义)提供管理子节点对象的接口方法[可选]提供管理父节点对象的接口方法
Leaf
树形结构的叶节点
Component
的实现子类
Composite
树形结构的枝节点
Component
的实现子类
适用于
单个对象的使用具有一致性,将对象组合成树形结构表示部分--整体
//// Created by andrew on /11/21.//#include <iostream>#include <string>#include <list>using namespace std;/** `Composite`模式也叫做组合模式,是构造型的设计模式之一。通过递归的手段构造树形的对象结构,并可以通过一个对象来访问整个对象树。* */class IFile {public:~IFile() {}virtual void display() = 0;virtual int add(IFile *ifile) = 0;virtual int remove(IFile *ifile) = 0;virtual list<IFile *> *getChild() = 0;};class File : public IFile {public:// explicit 声明只有单个参数的构造函数explicit File(string name) {m_name = name;}void display() override {cout << m_name << endl;}int add(IFile *ifile) override {return -1;}int remove(IFile *ifile) override {return -1;}list<IFile *> *getChild() override {return NULL;}private:string m_name;};// 目录节点class Dir : public IFile {public:explicit Dir(string name) {m_name = name;m_list = new list<IFile *>;m_list->clear();}void display() override {cout << m_name << endl;}int add(IFile *ifile) override {m_list->push_back(ifile);return 0;}int remove(IFile *ifile) override {m_list->remove(ifile);return 0;}list<IFile *> *getChild() override {return m_list;}private:// 父目录中有一个或者多个子目录,因此是个链表, 子目录能通过父节点得到string m_name;list<IFile *> *m_list;};// 递归显示树void showTree(IFile *root, int level) {int i = 0;if (root == NULL) {return;}for (i == 0; i < level; i++){printf("\t");}// 显示根节点root->display();// 若根节点有孩子// 判断孩子是文件还是文件,显示名字list<IFile *> *mylist = root->getChild(); // 获取子目录if(mylist != NULL){for (auto it = mylist->begin(); it != mylist->end(); it++){if((*it)->getChild() == NULL){//不是目录就打印文件名 for循环是按照level等级将制表符打印出来for(i = 0;i<=level;i++){printf("\t");}(*it)->display();} else{//是目录就接着递归showTree(*it, level+1);}}}}int main(int argc, char *argv[]) {Dir *root = new Dir("C");Dir *dir1 = new Dir("111dir");File *aFile = new File("a.txt");// 获取root下的节点 孩子集合list<IFile *> *mylist = root->getChild();root->add(dir1);root->add(aFile);for(auto it=mylist->begin(); it != mylist->end(); it++){(*it)->display();}Dir *dir2 = new Dir("dir2");File *bFile = new File("b.txt");dir1->add(dir2);dir1->add(bFile);cout << "通过 showTree 方式显示root节点下的所有子节点" << endl;showTree(root,0);cout << "composite pattern" << endl;return 0;}