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