博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《设计模式》学习笔记——组合模式
阅读量:4110 次
发布时间:2019-05-25

本文共 2447 字,大约阅读时间需要 8 分钟。

组合模式(Composite Pattern)将对象组合成树形结构以表示"部分-整体"的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。掌握组合模式的重点是要理解清楚 "部分/整体" 还有 "单个对象" 与 "组合对象" 的含义。组合模式可以让客户端像修改配置文件一样简单的完成本来需要流程控制语句来完成的功能。

CompositePattern.h

#pragma once#include
#include
#include
// 抽象接口class IFile{public: virtual void displayd() = 0; virtual int add(IFile* ifile) = 0; virtual int remove(IFile* ifile) = 0; virtual std::list
* getChiled() = 0;};// 具体类,文件节点class File:public IFile{public: File(std::string fileName): m_fileName(fileName){} virtual void displayd() { std::cout << m_fileName << std::endl; } virtual int add(IFile* ifile) { return -1; } virtual int remove(IFile* ifile) { return -1; } virtual std::list
* getChiled() { return nullptr; }private: std::string m_fileName;};// 具体实现,目录节点class Dir:public IFile{public: Dir(std::string dirName) : m_dirName(dirName) { m_list_p = new std::list
; m_list_p->clear(); } virtual void displayd() { std::cout << m_dirName << std::endl; } virtual int add(IFile* ifile) { m_list_p->push_back(ifile); return 0; } virtual int remove(IFile* ifile) { m_list_p->remove(ifile); return 0; } virtual std::list
* getChiled() { return m_list_p; }private: std::string m_dirName; std::list
* m_list_p;};class CompositePattern{public: CompositePattern() {}; ~CompositePattern() {};};

 

CompositePattern.cpp

#include "CompositePattern.h"

 

mainTest.cpp

#include
#include"CompositePattern.h"void showTree(IFile* root,int level);int main(void){ Dir* root = new Dir("C"); //root->displayd(); Dir* dir = new Dir("dir"); File* file = new File("file.txt"); // 添加 root->add(dir); root->add(file); // 获取root节点的孩子集合 std::list
* list = root->getChiled(); for (std::list
::iterator it = list->begin(); it != list->end(); it++) (*it)->displayd(); Dir* dir2 = new Dir("dir2"); File* file2 = new File("file2.txt"); dir->add(dir2); dir->add(file2); showTree(root,0); system("pause"); return 0;}void showTree(IFile* root, int level){ for (int i=0;i
displayd(); // 2、如果根节点有孩子 std::list
* childList = root->getChiled(); // 获取子节点集合 if (nullptr != childList) // 说明是目录 { for (std::list
::iterator it = childList->begin(); it != childList->end(); it++) { if (nullptr == (*it)->getChiled()) { for(int i=0; i<= level;i++) std::cout << "\t"; (*it)->displayd();// 如果是文件,显示文件名 } else { showTree((*it), level+1);// 如果是目录,递归调用showTree } } } }

 

转载地址:http://ghmsi.baihongyu.com/

你可能感兴趣的文章
XML生成(一):DOM生成XML
查看>>
XML生成(三):JDOM生成
查看>>
Ubuntu Could not open lock file /var/lib/dpkg/lock - open (13:Permission denied)
查看>>
collect2: ld returned 1 exit status
查看>>
C#入门
查看>>
查找最大值最小值
查看>>
C#中ColorDialog需点两次确定才会退出的问题
查看>>
数据库
查看>>
nginx反代 499 502 bad gateway 和timeout
查看>>
linux虚拟机安装tar.gz版jdk步骤详解
查看>>
python猜拳游戏
查看>>
python实现100以内自然数之和,偶数之和
查看>>
python数字逆序输出及多个print输出在同一行
查看>>
ESP8266 WIFI数传 Pixhaw折腾笔记
查看>>
苏宁产品经理面经
查看>>
百度产品经理群面
查看>>
去哪儿一面+平安科技二面+hr面+贝贝一面+二面产品面经
查看>>
element ui 弹窗在IE11中关闭时闪现问题修复
查看>>
vue 遍历对象并动态绑定在下拉列表中
查看>>
Vue动态生成el-checkbox点击无法选中的解决方法
查看>>