• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            積木

            No sub title

              C++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
              140 Posts :: 1 Stories :: 11 Comments :: 0 Trackbacks

            常用鏈接

            留言簿(1)

            我參與的團(tuán)隊(duì)

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            轉(zhuǎn)載自:http://patmusing.blog.163.com/blog/static/135834960201002321018760/


            在面向?qū)ο蟮南到y(tǒng)中,我們經(jīng)常會遇到一類具有
            容器特征的對象,即它們在充當(dāng)對象的同時,又是其他對象的容器。

            舉例:

            在操作系統(tǒng)中,文件的概念很廣泛,其中文件可以是普通文件,也可以是目錄(Unix中,設(shè)備也是文件),目錄中可以存放文件。Composite設(shè)計模式就是將客戶代碼與復(fù)雜的對象容器結(jié)構(gòu)解耦,讓對象容器自己來實(shí)現(xiàn)自身的復(fù)雜結(jié)構(gòu),從而使得客戶代碼就像處理簡單對象(文件)一樣來處理復(fù)雜的對象容器(目錄)

            “Compose objects into tree structures to represent part-whole hierarchies. Composite lets clients treat individual objects and compositions of objects uniformly.” – GoF

            10. C++實(shí)現(xiàn)Structural - Composite模式 - 玄機(jī)逸士 - 玄機(jī)逸士博客

            調(diào)用Directory類對象的process函數(shù),和調(diào)用PhysicalFile類對象的process一樣簡單。

            從上面的UML類圖中,可以看出DirectoryFile這兩個類之間的關(guān)系:

            1. Directory “is a”File

            2. Directory “has a(more)” File

            這是典型的遞歸結(jié)構(gòu)。因此在處理遞歸問題時,如果必要,可以考慮采用Composite模式。后面要講到的Decorator模式也是如此。

            // Composite.h

            #include <iostream>

            #include <list>

            using namespace std;

            class File

            {

            public:

            virtual void process() = 0;

            // 虛函數(shù):增加一個文件

            virtual void add(File* file)

            {

            }

            // 虛函數(shù):刪除一個文件

            virtual void remove(File* file)

            {

            }

            public:

            virtual ~File()

            {

            cout << "in the destructor of File..." << endl;

            }

            };

            // 葉子節(jié)點(diǎn)

            class PhysicalFile : public File

            {

            public:

            void process()

            {

            cout << "process() in PhysicalFile..." << endl;

            }

            public:

            ~PhysicalFile()

            {

            cout << "in the destructor of PhysicalFile..." << endl;

            }

            };

            // 容器節(jié)點(diǎn):Composite節(jié)點(diǎn)

            class Directory : public File

            {

            private:

            list<File*> file_list;

            public:

            Directory()

            {

            }

            void process()

            {

            cout << "process() in Directory..." << endl;

            if(!file_list.empty())

            {

            for(list<File*>::iterator it = file_list.begin(); it != file_list.end(); it++)

            {

            File* f = *it;

            f->process();

            }

            }

            }

            void add(File* file)

            {

            file_list.push_back(file);

            }

            void remove(File* file)

            {

            file_list.remove(file);

            }

            public:

            ~Directory()

            {

            cout << "in the destructor of Directory..." << endl;

            }

            };

            // Composite.cpp

            #include "Composite.h"

            int main(int argc, char **argv)

            {

            File *f1 = new Directory;

            File *f2 = new Directory;

            File *f3 = new PhysicalFile;

            f2->add(f3);

            f1->add(f2);

            File *f4 = new Directory;

            File *f5 = new Directory;

            File *f6 = new Directory;

            File *f7 = new PhysicalFile;

            f6->add(f7);

            f5->add(f6);

            f4->add(f5);

            f1->add(f4);

            f1->process();

            f1->remove(f4);

            cout << "+++++++++++++++++++++++" << endl;

            f1->process();

            // STL container中的元素是指針對象,那么必須手動刪除。

            delete f1;

            delete f2;

            delete f3;

            delete f4;

            delete f5;

            delete f6;

            delete f7;

            return 0;

            }

            上述程序中,各對象之間的關(guān)系如下圖:

            10. C++實(shí)現(xiàn)Structural - Composite模式 - 玄機(jī)逸士 - 玄機(jī)逸士博客

            其中f3f7PhysicalFile對象。f1包含了f2f4f2包含了f3f4包含了f5f5包含了f6f6包含了f7

            運(yùn)行結(jié)果如下:

            process() in Directory... // f1

            process() in Directory... // f2

            process() in PhysicalFile... // f3

            process() in Directory... // f4

            process() in Directory... // f5

            process() in Directory... // f6

            process() in PhysicalFile... // f7

            +++++++++++++++++++++++ // 刪除f4后的輸出(可以看到f4及其包含的對象全部被刪除了)

            process() in Directory... // f1

            process() in Directory... // f2

            process() in PhysicalFile... // f3

            in the destructor of Directory...

            in the destructor of File...

            in the destructor of Directory...

            in the destructor of File...

            in the destructor of PhysicalFile...

            in the destructor of File...

            in the destructor of Directory...

            in the destructor of File...

            in the destructor of Directory...

            in the destructor of File...

            in the destructor of Directory...

            in the destructor of File...

            in the destructor of PhysicalFile...

            in the destructor of File...



            posted on 2013-03-07 22:33 Jacc.Kim 閱讀(227) 評論(0)  編輯 收藏 引用 所屬分類: 設(shè)計模式
            99久久婷婷免费国产综合精品| 国产精品99久久免费观看| 国产精品久久成人影院| 欧美牲交A欧牲交aⅴ久久| 色综合久久久久无码专区 | 欧美一级久久久久久久大| 国产成人精品免费久久久久| 一本色综合网久久| 亚洲精品乱码久久久久久蜜桃不卡| 久久人人爽人人人人片av| www亚洲欲色成人久久精品| 亚洲国产天堂久久综合| 久久精品国产亚洲沈樵| 久久精品亚洲中文字幕无码麻豆| 久久男人中文字幕资源站| 国产欧美一区二区久久| 久久人妻少妇嫩草AV无码蜜桃| 亚洲av成人无码久久精品| 色噜噜狠狠先锋影音久久| 老色鬼久久亚洲AV综合| 国产精品永久久久久久久久久| 国产69精品久久久久9999APGF| 国内精品伊人久久久久影院对白| 久久亚洲国产中v天仙www| 久久国语露脸国产精品电影 | 国产亚洲精久久久久久无码AV| 久久这里有精品| 久久久久久国产a免费观看黄色大片 | 女同久久| 99久久免费国产精品| 91精品国产91热久久久久福利| 久久久无码精品亚洲日韩京东传媒 | 久久精品国产秦先生| 久久久久亚洲AV无码专区体验| 久久婷婷色香五月综合激情| 久久伊人中文无码| 精品久久久久久99人妻| 人妻丰满?V无码久久不卡| 久久久久久久久久免免费精品| 合区精品久久久中文字幕一区| 久久精品国产亚洲一区二区三区|