下面是组合模式的UML类图:

<span style="font-family:Microsoft YaHei;font-size:18px;"><span style="font-family:Microsoft YaHei;font-size:18px;">//composite.h

#ifndef _COMPOSITE_H_
#define _COMPOSITE_H_ #include <vector>
using namespace std; /*
Component 抽象基类,为组合中的对象声明接口,声明了类共有接口的缺省行为
(如这里的Add,Remove,GetChild函数),声明一个接口函数可以访问Component的子组件
*/ class Component
{
public:
//纯虚函数,只提供接口,没有默认实现
virtual void Operation() = 0; // 虚函数,提供接口,有默认的实现就是什么都不做
virtual void Add(Component* com);
virtual void Remove(Component* com);
virtual Component* GetChild(int index);
virtual ~Component(); protected:
Component();
private:
}; //Leaf是叶子节点,也就是不含有子组件的节点类,所以不用实现Add,Remove,GetChild等方法 class Leaf:public Component
{
public:
//只实现Operation接口
virtual void Operation();
Leaf();
~Leaf(); protected:
private:
}; //Composite:含有子组件的类
class Composite:public Component
{
public:
Composite();
~Composite();
//实现所有接口
void Operation();
void Add(Component* com);
void Remove(Component* com);
Component* GetChild(int index); protected:
private:
vector<Component* >m_ComVec;
}; #endif</span></span>
<span style="font-family:Microsoft YaHei;font-size:18px;">//composite.cpp
// composite.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include "composite.h"
#include <iostream>
#include <vector>
using namespace std; Component::Component()
{} Component::~Component()
{} void Component::Add(Component* com)
{
cout<<"Add"<<endl;
} void Component::Remove(Component* com)
{ } void Component::Operation()
{
cout<<"Component::Operarion"<<endl;
} Component* Component::GetChild(int index)
{
return NULL;
} Leaf::Leaf()
{ } Leaf::~Leaf()
{ } void Leaf::Operation()
{
cout<<"Leaf::Operation"<<endl; } Composite::Composite()
{ } Composite::~Composite()
{ } void Composite::Add(Component* com)
{
this->m_ComVec.push_back(com);
} void Composite::Remove(Component* com)
{
vector<Component* >::iterator iter = this->m_ComVec.begin();
while (iter!=this->m_ComVec.end())
{
if (*iter == com)
{
iter = this->m_ComVec.erase(iter);
}
}
//this->m_ComVec.erase(com);
} void Composite::Operation()
{
cout<<"Composite::Operation"<<endl;
vector<Component*>::iterator iter = this->m_ComVec.begin();
for (;iter!= this->m_ComVec.end();iter++)
{
(*iter)->Operation();
}
} Component* Composite::GetChild(int index)
{
if (index < 0 ||index > this->m_ComVec.size())
{
return NULL;
}
return this->m_ComVec[index];
} int _tmain(int argc, _TCHAR* argv[])
{
/*
不管是叶子Leaf还是Composite对象pRoot、pCom都实现了Operation接口,所以可以一致对待,直接调用Operation()
体现了“使得用户对单个对象和组合对象的使用具有一致性。”
*/
Composite* pRoot = new Composite(); //组合对象添加叶子节点
pRoot->Add(new Leaf()); Leaf* pLeaf1 = new Leaf();
Leaf* pLeaf2 = new Leaf(); //这里的叶子再添加叶子是没有意义的。
//由于叶子与组合对象继承了相同的接口,所以语法上是对的,实际上什么也没做(继承自基类Component的Add方法)。
//叶子节点只实现了Operation方法,其他Add、Remove、GetChild都继承自基类,没有实际意义。
pLeaf1->Add(pLeaf2);
pLeaf1->Remove(pLeaf2);
//执行叶子Operation操作
pLeaf1->Operation(); //组合对象实现了基类Component的所有接口,所以可以做各种操作(Add、Remove、GetChild、Operation)。
Composite* pCom = new Composite();
//组合对象添加叶子节点
pCom->Add(pLeaf1);
//组合对象添加叶子节点
pCom->Add(pLeaf2);
//执行组合对象Operation操作
pCom->Operation(); //组合对象添加组合对象
// pRoot->Add(pCom); //执行组合对象Operation操作
//pRoot->Operation(); //Component* cp = pCom->GetChild(0);
//cp->Operation(); //pCom->Remove(pLeaf1); getchar();
return 0;
} </span>

输出结果:

文章来源:

http://www.cnblogs.com/jiese/p/3168844.html

设计模式学习--组合模式,c++代码的更多相关文章

  1. (@WhiteTaken)设计模式学习——组合模式

    下面来学习一下组合模式. 组合模式概念是什么呢.从别的地方抄来了一些理论. 理论:将对象组合成树形结构以表示"部分-整体"的层次结构.Composite模式使得用户对单个对象和组合 ...

  2. 设计模式学习--迭代器模式(Iterator Pattern)和组合模式(Composite Pattern)

    设计模式学习--迭代器模式(Iterator Pattern) 概述 ——————————————————————————————————————————————————— 迭代器模式提供一种方法顺序 ...

  3. C#设计模式(10)——组合模式(Composite Pattern)

    一.引言 在软件开发过程中,我们经常会遇到处理简单对象和复合对象的情况,例如对操作系统中目录的处理就是这样的一个例子,因为目录可以包括单独的文件,也可以包括文件夹,文件夹又是由文件组成的,由于简单对象 ...

  4. 设计模式学习--复合模式(Compound Pattern)

    设计模式学习--复合模式(Compound Pattern) 概述 ——————————————————————————————————————————————————— 2013年8月4日<H ...

  5. PHP设计模式之组合模式

    当我们的一个对象可能代表一个单一的实体,或者一个组合的实体,但是仍然需要通过同样的方式被使用时,这种情形则适合使用组合模式的设计. 组合模式是一种结构型模式. 当看了书上的解释之后,并不是很理解,遂去 ...

  6. JavaScript设计模式之----组合模式

    javascript设计模式之组合模式 介绍 组合模式是一种专门为创建Web上的动态用户界面而量身制定的模式.使用这种模式可以用一条命令在多个对象上激发复杂的或递归的行为.这可以简化粘合性代码,使其更 ...

  7. C#设计模式(10)——组合模式(Composite Pattern)(转)

    一.引言 在软件开发过程中,我们经常会遇到处理简单对象和复合对象的情况,例如对操作系统中目录的处理就是这样的一个例子,因为目录可以包括单独的文件,也可以包括文件夹,文件夹又是由文件组成的,由于简单对象 ...

  8. C#设计模式:组合模式(Composite Pattern)

    一,C#设计模式:组合模式(Composite Pattern) using System; using System.Collections.Generic; using System.Linq; ...

  9. c++设计模式15 --组合模式

    今天研究了一下设计模式15 组合模式 本人是菜鸟一枚,所以一开始完全不懂组合究竟是什么意思.先上图一张,树形结构图: 文档说,如果想做出这样的结构,通常考虑组合模式.那是为什么呢?现在让我们看一下组合 ...

随机推荐

  1. JQuery 初探

    放暑假了,终于有时间能学点前端的东西了.JQuery就是我第一个选择,锋利的JQuery.这本书真的很好.下面以一个ToggleButton形式的小例子开场吧. 引入JQuery库 在网页上引用JQu ...

  2. Java 8 新特性之 Lambda表达式

    Lambda的出现就是为了增强Java面向过程编程的深度和灵活性.今天就来分享一下在Java中经常使用到的几个示例,通过对比分析,效果应该会更好. – 1.实现Runnable线程案例 其存在的意义就 ...

  3. [ExtJS5学习笔记]第三十二节 sencha extjs 5与struts2的ajax交互配置

    本文地址:http://blog.csdn.net/sushengmiyan/article/details/43487751 本文作者:sushengmiyan ------------------ ...

  4. Python爬虫! 单爬,批量爬,这都不是事!

    昨天做了一个煎蛋网妹子图的爬虫,个人感觉效果不错.但是每次都得重复的敲辣么多的代码(相比于Java或者其他语言的爬虫实现,Python的代码量可谓是相当的少了),就封装了一下!可以实现对批量网址以及单 ...

  5. ubuntu常用文件搜索命令

    1.find find [搜索路径] [搜索关键字] 比如查找/test中文件名为t5.tmp的文件: 查找根目录下大于100M的文件 注意,这里的204800单位是块,1块=512字节 在根目录下查 ...

  6. J2EE学习从菜鸟变大鸟之七 Servlet

    Servlet现在自己的理解是一个控制器,简单的可以理解为不同的JSP页面由用户发送过来的请求可以由Servlet控制器来控制其向下调用的方向(结合三层好理解),但它比较特殊,因为它通常会从外界接收数 ...

  7. ffplay for mfc 代码备忘

    之前上传了一个开源播放器工程ffplay for mfc.它将ffmpeg项目中的ffplay播放器(ffplay.c)移植到了VC的环境下,并且使用MFC做了一套界面.它可以完成一个播放器播放视频的 ...

  8. iOS模仿京东商城中的选择地区样式

    在ViewController文件中创建添加地址界面: @property(nonatomic,strong)UILabel *selectAreaLabel;//地区显示@property(nona ...

  9. Awards and Certifications @EMC

    1. Awards 1.1 Jun. 12, 2012, Accurev Migration 1.2 Oct. 16, 2012, Deliver Inyo RTM to Rockies 1.3 Ju ...

  10. (NO.00003)iOS游戏简单的机器人投射游戏成形记(三)

    接下来我们建立机器人对象. 在Sprites文件夹中新建Robot.ccb文件,类型为Node. 打开SpriteBuilder的Tileless View将机器人身体和手臂拖入根节点,调整好相对的位 ...