博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式-组合模式
阅读量:6759 次
发布时间:2019-06-26

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

组合模式(Composite)的定义为:组合多个对象形成树形结构,以表示整体-部分的结构层次。组合模式对单个对象和组合对象的使用具有一致性。其结构图如下:

 
例如一个新闻的树形菜单,它包含很多原始菜单(如国内、国际),以及由其子菜单组成的组合节点(如国内新闻下的时事、社会等),结构图如下:
实现代码:

// Menu.h
#include  < string >
class  Menu  
{
public :
     virtual   ~ Menu();
     virtual   void  Add(Menu * );
     virtual   void  Remove(Menu * );
     virtual  Menu *  GetChild( int );
     virtual   void  Display()  =   0 ;
protected :
    Menu();
    Menu(std:: string );
    std:: string  m_strName;
};
// Menu.cpp
#include  " stdafx.h "
#include  " Menu.h "
Menu::Menu()
{
}
Menu::Menu(std:: string  strName) : m_strName(strName)
{
}
Menu:: ~ Menu()
{
}
void  Menu::Add(Menu *  pMenu)
{}
void  Menu::Remove(Menu *  pMenu)
{}
Menu *  Menu::GetChild( int  index)
{
     return  NULL;
}
// SubMenu.h
#include  " Menu.h "
class  SubMenu :  public  Menu  
{
public :
    SubMenu();
    SubMenu(std:: string );
     virtual   ~ SubMenu();
     void  Display();
};
// SubMenu.cpp
#include  " stdafx.h "
#include  " SubMenu.h "
#include  < iostream >
using   namespace  std;
SubMenu::SubMenu()
{
}
SubMenu::SubMenu( string  strName) : Menu(strName)
{
}
SubMenu:: ~ SubMenu()
{
}
void  SubMenu::Display()
{
    cout  <<  m_strName  <<  endl;
}
// CompositMenu.h
#include  " Menu.h "
#include  < vector >
class  CompositMenu :  public  Menu
{
public :
    CompositMenu();
    CompositMenu(std:: string );
     virtual   ~ CompositMenu();
     void  Add(Menu * );
     void  Remove(Menu * );
    Menu *  GetChild( int );
     void  Display();
private :
    std::vector < Menu *>  m_vMenu;
};
// CompositMenu.cpp
#include  " stdafx.h "
#include  " CompositMenu.h "
#include  < iostream >
using   namespace  std;
CompositMenu::CompositMenu()
{
    
}
CompositMenu::CompositMenu( string  strName) : Menu(strName)
{
}
CompositMenu:: ~ CompositMenu()
{
}
void  CompositMenu::Add(Menu *  pMenu)
{
    m_vMenu.push_back(pMenu);
}
void  CompositMenu::Remove(Menu *  pMenu)
{
    m_vMenu.erase( & pMenu);
}
Menu *  CompositMenu::GetChild( int  index)
{
     return  m_vMenu[index];
}
void  CompositMenu::Display()
{
    cout  <<   " + "   <<  m_strName  <<  endl;
    vector < Menu *> ::iterator it  =  m_vMenu.begin();
     for  (; it  !=  m_vMenu.end();  ++ it)
    {
        cout  <<   " |- " ;
        ( * it) -> Display();
    }
}
#include  " stdafx.h "
#include  " Menu.h "
#include  " SubMenu.h "
#include  " CompositMenu.h "
int  main( int  argc,  char *  argv[])
{
    Menu *  pMenu  =   new  CompositMenu( " 国内新闻 " );
    pMenu -> Add( new  SubMenu( " 时事新闻 " ));
    pMenu -> Add( new  SubMenu( " 社会新闻 " ));
    pMenu -> Display();
    pMenu  =   new  CompositMenu( " 国际新闻 " );
    pMenu -> Add( new  SubMenu( " 国际要闻 " ));
    pMenu -> Add( new  SubMenu( " 环球视野 " ));
    pMenu -> Display();
     return   0 ;
}

最后输出为:
+国内新闻
|-时事新闻
|-社会新闻
+国际新闻
|-国际要闻
|-环球视野

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

你可能感兴趣的文章
Android内存优化(三)详解内存分析工具MAT
查看>>
SQL Server事务遭遇网络异常时的处理机制浅析
查看>>
Intellij IDEA创建的Web项目配置Tomcat并启动Maven项目
查看>>
SpringMVC上传图片总结(1)---常规方法进行图片上传,使用了MultipartFile、MultipartHttpServletRequest...
查看>>
libcgi库安装
查看>>
小米:开源不仅要站在巨人的肩膀上,还要为巨人指方向
查看>>
百度启动高管退休计划,总裁张亚勤今年十月退休
查看>>
RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2-&amp;gt;新增“行政区域管理”,同时大批量树采用异步加载...
查看>>
SpringBoot启动时的Banner设置
查看>>
xming + putty 搭建远程图形化ssh访问ubuntu 14.04
查看>>
【Sigma敏捷版系列文章】从运行流程和list-watch看kubernetes系统的设计理念
查看>>
两列布局——但只用右浮动
查看>>
GNOME 网页浏览器 Epiphany 将要进行 5 项改进
查看>>
今年CES最大亮点:智能语音助手正成为新趋势
查看>>
Windows Mysql Server重启, log-bin路径配置
查看>>
刘剑锋:友云采助力企业数字化采购的新发展
查看>>
Rainbond 5.0.4 发布,做最好用的云应用操作系统
查看>>
亚马逊宣布与西云数据达成合作,旨在进一步扩大中国业务
查看>>
java nio的基础--缓冲区
查看>>
负载均衡沙龙活动第二期现场问答汇集
查看>>