日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

23种设计模式C++源码与UML实现--组合模式

發(fā)布時(shí)間:2025/3/15 c/c++ 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。