C++设计模式之组合模式(Composite)

 更新时间:2021年09月03日 16:19:54   作者:chencarl  
这篇文章主要为大家详细介绍了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++中平衡二叉搜索树的模拟实现

    C++中平衡二叉搜索树的模拟实现

    二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下,所以本文给大家介绍了C++平衡二叉的搜索树模拟实现方法,需要的朋友可以参考下
    2023-09-09
  • 深入理解C++中常见的关键字含义

    深入理解C++中常见的关键字含义

    本篇文章是对C++中常见关键字的含义进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 使用Visual Studio 2010/2013编译V8引擎步骤分享

    使用Visual Studio 2010/2013编译V8引擎步骤分享

    这篇文章主要介绍了使用Visual Studio 2013编译V8引擎步骤分享,需要的朋友可以参考下
    2015-08-08
  • C++实现推箱子小游戏源码

    C++实现推箱子小游戏源码

    这篇文章主要为大家详细介绍了C++实现推箱子小游戏源码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • C++中关于this指针的入门介绍

    C++中关于this指针的入门介绍

    this 指针在C++类和对象中是个很方便实用的关键字,可以简化对象成员属性的调用,使代码表达的含义更加准确;在之前的学习中我们都可以判断变量所占内存空间大小,那么我们创建的类对象所占的内存空间怎么计算呢?想知道this的妙用和类对象占用的内存空间就来跟我学习吧
    2022-07-07
  • C++ LeetCode0547题解省份数量图的连通分量

    C++ LeetCode0547题解省份数量图的连通分量

    这篇文章主要为大家介绍了C++ LeetCode0547题解省份数量图的连通分量示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • 华为机试题之统计单词个数实例代码

    华为机试题之统计单词个数实例代码

    这篇文章主要介绍了华为机试题之统计单词个数实例代码的相关资料,需要的朋友可以参考下
    2017-05-05
  • C++位图的实现原理与方法

    C++位图的实现原理与方法

    位图(bitset)是一种常用的数据结构,常用在给一个很大范围的数,判断其中的一个数是不是在其中。这篇文章主要给大家介绍了关于C++位图以及位图的实现原理与方法,需要的朋友可以参考下
    2021-05-05
  • Qt实现小功能之圆形进度条的方法详解

    Qt实现小功能之圆形进度条的方法详解

    在Qt自带的控件中,只有垂直进度条、水平进度条两种。在平时做页面开发时,有些时候会用到圆形进度条,比如说:下载某个文件的下载进度。本文就来实现一个圆形进度条,需要的可以参考一下
    2022-10-10
  • c语言实现http下载器的方法

    c语言实现http下载器的方法

    这篇文章主要介绍了c语言实现http下载器的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-07-07

最新评论