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 }

 

運行結果為


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: