23种设计模式C++源码与UML实现--组合模式
生活随笔
收集整理的這篇文章主要介紹了
23种设计模式C++源码与UML实现--组合模式
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
組合模式
Composite模式也叫做組合模式,是構(gòu)造型的設(shè)計(jì)模式之一。通過(guò)遞歸的手段構(gòu)造樹(shù)形的對(duì)象結(jié)構(gòu),并可以通過(guò)一個(gè)對(duì)象來(lái)訪問(wèn)整個(gè)對(duì)象樹(shù)。
Component樹(shù)形結(jié)構(gòu)的節(jié)點(diǎn)抽象
- 為所有的對(duì)象定義統(tǒng)一的接口(公共屬性,行為等的定義)
- 提供管理子節(jié)點(diǎn)對(duì)象的接口方法
- [可選]提供管理父節(jié)點(diǎn)對(duì)象的接口方法
Leaf樹(shù)形結(jié)構(gòu)的葉節(jié)點(diǎn)
- Component的實(shí)現(xiàn)子類
Composite樹(shù)形結(jié)構(gòu)的枝節(jié)點(diǎn)
- Component的實(shí)現(xiàn)子類
適用于
? 單個(gè)對(duì)象的使用具有一致性,將對(duì)象組合成樹(shù)形結(jié)構(gòu)表示部分--整體
// // Created by andrew on 2020/11/21. // #include <iostream> #include <string> #include <list>using namespace std;/** `Composite`模式也叫做組合模式,是構(gòu)造型的設(shè)計(jì)模式之一。通過(guò)遞歸的手段構(gòu)造樹(shù)形的對(duì)象結(jié)構(gòu),并可以通過(guò)一個(gè)對(duì)象來(lái)訪問(wèn)整個(gè)對(duì)象樹(shù)。* */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 聲明只有單個(gè)參數(shù)的構(gòu)造函數(shù)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;};// 目錄節(jié)點(diǎn) 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: // 父目錄中有一個(gè)或者多個(gè)子目錄,因此是個(gè)鏈表, 子目錄能通過(guò)父節(jié)點(diǎn)得到string m_name;list<IFile *> *m_list; };// 遞歸顯示樹(shù) void showTree(IFile *root, int level) {int i = 0;if (root == NULL) {return;}for (i == 0; i < level; i++){printf("\t");} // 顯示根節(jié)點(diǎn)root->display(); // 若根節(jié)點(diǎn)有孩子 // 判斷孩子是文件還是文件,顯示名字list<IFile *> *mylist = root->getChild(); // 獲取子目錄if(mylist != NULL){for (auto it = mylist->begin(); it != mylist->end(); it++){if((*it)->getChild() == NULL){ // 不是目錄就打印文件名 for循環(huán)是按照l(shuí)evel等級(jí)將制表符打印出來(lái)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下的節(jié)點(diǎn) 孩子集合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 << "通過(guò) showTree 方式顯示root節(jié)點(diǎn)下的所有子節(jié)點(diǎn)" << endl;showTree(root,0);cout << "composite pattern" << endl;return 0; }總結(jié)
以上是生活随笔為你收集整理的23种设计模式C++源码与UML实现--组合模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: rabbitmq rpc
- 下一篇: 23种设计模式C++源码与UML实现--