C++设计模式之组合模式(Composite)
更新时间:2020年4月25日 17:28 点击:1490
组合模式为了描述分支包含关系,也就是我们说的树形关系,其对象分为枝和叶,每一枝可包含枝和叶,直到全部为叶节点。我们对枝和叶进行行为抽象,可认为枝和叶都是Component,而叶是最小的操作单元,其下不存在枝和叶,而枝作为Composite里面存有其下枝和叶的组件列表。
作用
将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性
类视图
实现
#include <iostream> #include <list> #include <string> using namespace std; class menu { public: menu(string in) : name(in){} ~menu(){} virtual void Add(menu*) = 0; virtual void Remove(menu*) = 0; virtual void showname() = 0; protected: string name; }; class Leafmenu : public menu { public: Leafmenu(string in) : menu(in){} ~Leafmenu(){} void showname() { cout<< "Leaf : " << name << endl; } virtual void Add(menu*){} virtual void Remove(menu*){} }; class Compositemenu : public menu { public: Compositemenu(string in) : menu(in){} void showname() { cout<< "Composit : "<< name << endl; list<menu*>::iterator iter = m_child.begin(); while (iter != m_child.end()) { (*iter)->showname(); iter++; } } virtual void Add(menu*m){ m_child.push_back(m); } virtual void Remove(menu*m){ m_child.remove(m); } private: list<menu*> m_child; }; //调用实现 int main { Compositemenu mainmenu("Main"); /***添加File菜单****/ Compositemenu *pFile = new Compositemenu("File"); Leafmenu *pNew = new Leafmenu("New"); Leafmenu *pOpen = new Leafmenu("Open"); Leafmenu *pClose = new Leafmenu("Close"); pFile->Add(pNew); pFile->Add(pOpen); pFile->Add(pClose); mainmenu.Add(pFile); /***添加Edit菜单****/ Compositemenu *pEdit = new Compositemenu("Edit"); Leafmenu *pCopy = new Leafmenu("Copy"); Leafmenu *pPaste = new Leafmenu("Paste"); pEdit->Add(pCopy); pEdit->Add(pPaste); mainmenu.Add(pFile); Leafmenu *pExit = new Leafmenu("Exit"); Leafmenu *pHelp = new Leafmenu("Help"); mainmenu.Add(pExit); mainmenu.Add(pHelp); mainmenu.showname(); delete pNew; delete pOpen; delete pClose; delete pFile; delete pCopy; delete pPaste; delete pEdit; delete pExit; delete pHelp; }
关于叶对节点的操作方法,如上面例子中add、remove、get等,其实是不需要的,因为基类申明的是纯虚函数,所以必须进行实现,但是在调用时没有任何意义,这就带来了一些使用的风险,安全的做法是将这些操作从基类中移除,添加到composite类中,这样在编译时就可以检查到调用问题,不过这样做显然又阻碍了接口的一致性,权衡利弊的选择还需自己根据需要来。
应用场景
常用的树形结构操作,如文件结构、菜单、组织结构等
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持猪先飞。
上一篇: C语言实现的循环单链表功能示例
下一篇: C语言实现的双链表功能完整示例
相关文章
- vector是表示可以改变大小的数组的序列容器,本文主要介绍了C++STL标准库std::vector的使用详解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2022-03-06
- 这篇文章主要介绍了C++中取余运算的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
- 这篇文章主要介绍了C++ string常用截取字符串方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
- 本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
- 本篇文章主要介绍了C++中四种加密算法之AES源代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。...2020-04-25
- 整数拆分,指把一个整数分解成若干个整数的和。本文重点给大家介绍C++ 整数拆分方法详解,非常不错,感兴趣的朋友一起学习吧...2020-04-25
- 这篇文章主要为大家介绍了JavaScript设计模式中的装饰者模式,对JavaScript设计模式感兴趣的小伙伴们可以参考一下...2016-01-21
- 神马是“解释器模式”?先翻开《GOF》看看Definition:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。在开篇之前还是要科普几个概念: 抽象语法树: 解释器模式并未解释如...2014-06-07
- 这篇文章主要介绍了C++中Sort函数详细解析,sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变...2022-08-18
- 这篇文章主要介绍了C++万能库头文件在vs中的安装步骤(图文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
- 这篇文章主要介绍了C++ bitset用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
- 本篇文章小编并不是为大家讲解string类型的用法,而是讲解我个人比较好奇的问题,就是string 类型占几个字节...2020-04-25
- 这篇文章主要为大家详细介绍了C++ Eigen库计算矩阵特征值及特征向量,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25
- 这篇文章主要介绍了C++ pair的用法实例详解的相关资料,需要的朋友可以参考下...2020-04-25
- 这篇文章主要介绍了VSCode C++多文件编译的简单使用方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-29
- 虽然C++11引入了智能指针的,但是开发人员在与内存的斗争问题上并没有解放,如果我门实用不当仍然有内存泄漏问题,其中智能指针的循环引用缺陷是最大的问题。下面通过实例代码给大家介绍c++中的循环引用,一起看看吧...2020-04-25
- 这篇文章主要介绍了JavaScript设计模式之职责链模式,对设计模式感兴趣的同学,可以参考下...2021-04-25
- 这篇文章主要给大家介绍了关于C++随机点名生成器的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
- map容器是C++ STL中的重要一员,删除map容器中value为指定元素的问题是我们经常与遇到的一个问题,下面这篇文章主要给大家介绍了关于利用C++如何删除map容器中指定值的元素的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。...2020-04-25
- 这篇文章主要介绍了C++ 约瑟夫环问题案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...2021-08-15