单个对象和组合对象的使用具有一致性。将对象组合成树形结构以表示"部分--整体"
例如:文件和目录的显示,单个对象是文件,组合对象是目录,一致性是显示。
1 #include <iostream> 2 #include <string> 3 #include <list> 4 5 using namespace std; 6 class IFile 7 { 8 public: 9 virtual void display() = 0; 10 virtual int add(IFile *iFile) = 0; 11 virtual int remove(IFile *iFile) = 0; 12 virtual list<IFile*>* getChild() = 0; 13 }; 14 15 //文件节点 16 class File : public IFile 17 { 18 public: 19 File(string name) 20 { 21 m_name = name; 22 } 23 virtual void display() 24 { 25 cout << m_name << endl; 26 } 27 28 virtual int add(IFile *iFile) 29 { 30 return -1; 31 } 32 virtual int remove(IFile *iFile) 33 { 34 return -1; 35 } 36 virtual list<IFile*>* getChild() 37 { 38 return NULL; 39 } 40 41 private: 42 string m_name; 43 }; 44 45 //目录节点 46 class Dir : public IFile 47 { 48 public: 49 Dir(string name) 50 { 51 m_name = name; 52 m_list = new list<IFile *>; 53 } 54 55 virtual void display() 56 { 57 cout << m_name << endl; 58 } 59 60 virtual int add(IFile *iFile) 61 { 62 m_list->push_back(iFile); 63 return 1; 64 } 65 66 virtual int remove(IFile *iFile) 67 { 68 m_list->remove(iFile); 69 return 1; 70 } 71 72 virtual list<IFile*>* getChild() 73 { 74 return m_list; 75 } 76 77 private: 78 string m_name; 79 list<IFile*> *m_list; 80 }; 81 82 int main() 83 { 84 Dir *root = new Dir("C....."); 85 root->display(); 86 Dir *dir1 = new Dir("1111dir1"); 87 File *file1 = new File("file1"); 88 root->add(dir1); 89 root->add(file1); 90 91 using iter = list<IFile*>::iterator; 92 list<IFile*> *list = root->getChild(); 93 for (iter it = list->begin(); it != list->end(); it++) 94 { 95 (*it)->display(); 96 } 97 98 return system("pause"); 99 }