设计模式学习--组合模式,c++代码

简介: 下面是组合模式的UML类图:     //composite.h#ifndef _COMPOSITE_H_#define _COMPOSITE_H_#include using namespace std;/*Component 抽象基类,为组合中的对象声明...


下面是组合模式的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

相关文章
|
2月前
|
C++ Windows
应用程序无法正常启动(0xc0000005)?C++报错0xC0000005如何解决?使命召唤17频频出现闪退,错误代码0xC0000005(0x0)
简介: 本文介绍了Windows应用程序出现错误代码0xc0000005的解决方法,该错误多由C++运行库配置不一致或内存访问越界引起。提供包括统一运行库配置、调试排查及安装Visual C++运行库等解决方案,并附有修复工具下载链接。
1094 1
|
9月前
|
存储 安全 C语言
C++ String揭秘:写高效代码的关键
在C++编程中,字符串操作是不可避免的一部分。从简单的字符串拼接到复杂的文本处理,C++的string类为开发者提供了一种更高效、灵活且安全的方式来管理和操作字符串。本文将从基础操作入手,逐步揭开C++ string类的奥秘,帮助你深入理解其内部机制,并学会如何在实际开发中充分发挥其性能和优势。
|
4月前
|
API 数据安全/隐私保护 C++
永久修改机器码工具, exe一机一码破解工具,软件机器码一键修改工具【c++代码】
程序实现了完整的机器码修改功能,包含进程查找、内存扫描、模式匹配和修改操作。代码使用
|
6月前
|
设计模式 Java 定位技术
【设计模式】【结构型模式】组合模式(Composite)
一、入门 什么是组合模式 组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构来表示“部分-整体”的层次关系。组合模式使得客户端可以统一处理单个对象和组合对
216 10
|
5月前
|
C++
爱心代码 C++
这段C++代码使用EasyX图形库生成动态爱心图案。程序通过数学公式绘制爱心形状,并以帧动画形式呈现渐变效果。运行时需安装EasyX库,教程链接:http://【EasyX图形库的安装和使用】https://www.bilibili.com/video/BV1Xv4y1p7z1。代码中定义了屏幕尺寸、颜色数组等参数,利用随机数与数学函数生成动态点位,模拟爱心扩散与收缩动画,最终实现流畅的视觉效果。
833 0
|
9月前
|
设计模式 存储 安全
「全网最细 + 实战源码案例」设计模式——组合模式
组合模式(Composite Pattern)是一种结构型设计模式,用于将对象组合成树形结构以表示“部分-整体”的层次结构。它允许客户端以一致的方式对待单个对象和对象集合,简化了复杂结构的处理。组合模式包含三个主要组件:抽象组件(Component)、叶子节点(Leaf)和组合节点(Composite)。通过这种模式,客户端可以统一处理简单元素和复杂元素,而无需关心其内部结构。适用于需要实现树状对象结构或希望以相同方式处理简单和复杂元素的场景。优点包括支持树形结构、透明性和遵循开闭原则;缺点是可能引入不必要的复杂性和过度抽象。
278 22
|
11月前
|
算法 网络安全 区块链
2023/11/10学习记录-C/C++对称分组加密DES
本文介绍了对称分组加密的常见算法(如DES、3DES、AES和国密SM4)及其应用场景,包括文件和视频加密、比特币私钥加密、消息和配置项加密及SSL通信加密。文章还详细展示了如何使用异或实现一个简易的对称加密算法,并通过示例代码演示了DES算法在ECB和CBC模式下的加密和解密过程,以及如何封装DES实现CBC和ECB的PKCS7Padding分块填充。
247 4
2023/11/10学习记录-C/C++对称分组加密DES
|
10月前
|
C++ 开发者
C++学习之继承
通过继承,C++可以实现代码重用、扩展类的功能并支持多态性。理解继承的类型、重写与重载、多重继承及其相关问题,对于掌握C++面向对象编程至关重要。希望本文能为您的C++学习和开发提供实用的指导。
159 16
|
算法 安全 C++
提高C/C++代码的可读性
提高C/C++代码的可读性
262 4
|
编译器 C语言 C++
配置C++的学习环境
【10月更文挑战第18天】如果想要学习C++语言,那就需要配置必要的环境和相关的软件,才可以帮助自己更好的掌握语法知识。 一、本地环境设置 如果您想要设置 C++ 语言环境,您需要确保电脑上有以下两款可用的软件,文本编辑器和 C++ 编译器。 二、文本编辑器 通过编辑器创建的文件通常称为源文件,源文件包含程序源代码。 C++ 程序的源文件通常使用扩展名 .cpp、.cp 或 .c。 在开始编程之前,请确保您有一个文本编辑器,且有足够的经验来编写一个计算机程序,然后把它保存在一个文件中,编译并执行它。 Visual Studio Code:虽然它是一个通用的文本编辑器,但它有很多插
474 6

热门文章

最新文章