C++设计模式之组合模式(Composite)
2019/7/10 22:35:35
本文主要是介绍C++设计模式之组合模式(Composite),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
组合模式为了描述分支包含关系,也就是我们说的树形关系,其对象分为枝和叶,每一枝可包含枝和叶,直到全部为叶节点。我们对枝和叶进行行为抽象,可认为枝和叶都是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++设计模式之组合模式(Composite)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-07-03微信支付提示下单账户与支付账户不一致-icode9专业技术文章分享
- 2024-07-03微信支付提示订单号重复-icode9专业技术文章分享
- 2024-07-02微服务启动nacos注册上去了,但是一直没有收到请求-icode9专业技术文章分享
- 2024-07-02如何检查文件的编码格式-icode9专业技术文章分享
- 2024-07-02sublime 更改编码格式-icode9专业技术文章分享
- 2024-06-30uniAPP 实现全屏左右滚动滚动的效果-icode9专业技术文章分享
- 2024-06-30如何在本地使用授权或插件-icode9专业技术文章分享
- 2024-06-30伪静态规则配置方法汇总-icode9专业技术文章分享
- 2024-06-29易优CMS安装常见问题汇总-icode9专业技术文章分享
- 2024-06-28易优新手必读安装教程-icode9专业技术文章分享