composite pattern -- 组合模式
composite pattern称为组合模式
在面向对象的系统中,我们经常会遇到一类具有"容器"特征的对象,即它们在充当对象的同时,又是其他对象的容器。
“Compose objects into tree structures to represent part-whole hierarchies. Composite lets clients treat individual objects and compositions of objects uniformly.” – GoF
举例:
在我们常用的windows操作系统中,"文件"的概念大家都知道,不仅可以是文件夹又可以是普通文件。文件夹下面又可放文件夹以及文件,通俗理解是一个树模型。Composite设计模式就是将“客户代码与复杂的对象容器结构”解耦,让对象容器自己来实现自身的复杂结构,从而使得客户代码就像处理简单对象(文件)一样来处理复杂的对象容器(目录)。
实例解析(完成一个树形结构)
有一个文件夹(work)下面有两个文件夹(Daily Record,Key Document)以及2个文件(Address Book,Schedule)。Daily Record下有两个文件(2012-12-18,2012-12-19),Key Document下有一个文件(Meeting document)。
1 class File 2 { 3 public: 4 File(std::string n) 5 :name(n) 6 {} 7 virtual ~File( ){} 8 virtual void Add(File *s){} 9 virtual int Remove(int n){} 10 virtual File* getChild(int n){}; 11 virtual void Operation( )=0; 12 protected: 13 std::string name; 14 }; 15 16 class Leaf:public File 17 { 18 public: 19 Leaf(std::string n) 20 :File(n) 21 { } 22 void Operation( ); 23 }; 24 void Leaf::Operation( ) 25 { 26 std::cout<<"The leaf is "<<name<<std::endl; 27 } 28 29 class subFile:public File 30 { 31 public: 32 subFile(std::string n) 33 :name(n) 34 {} 35 ~subFile( ); 36 void Add(File *s); 37 int Remove(int n); 38 File * getChild(int n); 39 void Operation( ); 40 private: 41 std::vector<File*> listFile; 42 }; 43 subFile::~subFile( ) 44 { 45 } 46 void subFile::Add(File *s) 47 { 48 listFile.push_back(s); 49 } 50 int subFile::Remove(int n) 51 { 52 if(n>listFile.size( )||n<0) 53 return -1; 54 listFile.erase(listFile.begin( )+n); 55 return 1; 56 } 57 File* subFile::getChild(int n) 58 { 59 if(n>listFile.size( )||n<0) 60 return NULL; 61 return listFile[n]; 62 } 63 void subFile::Operation( ) 64 { 65 std::vector<File*>::iterator iter=listFile.begin( ); 66 while( iter!=listFile.end( ) ) 67 { 68 //否则编译器会报错 69 std::cout<<"This document is "<<name<<std::endl; 70 (*iter)-> Operation( ); 71 iter++; 72 } 73 } 74 75 int main(int argc,char **argv) 76 { 77 File* f1=new subFile("Work"); 78 File* f2=new subFile("Daily Recond"); 79 File* f3=new subFile("Key Document); 80 File* f4=new Leaf("Address Book"); 81 File* f5=new Leaf("Schedule"); 82 f1->Add(f2); 83 f1->Add(f3); 84 f1->Add(f4); 85 f1->Add(f5); 86 File* f6=new Leaf("2012-12-18"); 87 File* f7=new Leaf("2012-12-19"); 88 f2->Add(f6); 89 f2->Add(f7); 90 File* f8=new Leaf("Meeting Document"); 91 f3->Add(f8); 92 f1->Operation( ); 93 delete f1; 94 delete f2; 95 delete f3; 96 delete f4; 97 delete f5; 98 delete f6; 99 delete f7; 100 delete f8; 101 return 0; 102 }
运行结果为