c++设计模式之组合模式

设计模式C++实现(7)——外观模式组合模式 软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累。最近看设计模式的书,对于每个模式,用C++写了个小例子,加深一下理解。主要参考《大 阅读详情

组合模式(Composite Pattern)-结构型


意图:组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。

举例:组合模式让你可以优化处理递归或分级数据结构。有许多关于分级数据结构的例子,使得组合模式非常有用武之地。

例如计算机的文件系统,文件系统由目录和文件组成。每个目录下可以有文件或是目录。目录的内容可以是文件,也可以是目录。

按照这种方式,计算机的文件系统就是以递归结构来组织的。如果你想要描述这样的数据结构,那么你可以使用组合模式Composite。

涉及角色:
1.Component 是组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理Component子部件。
2.Leaf 在组合中表示叶子结点对象,叶子结点没有子结点。
3.Composite 定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关操作,如增加(add)和删除(remove)等。


适用性场景:
1.你想表示对象的部分-整体层次结构
2.你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。


组合模式的结构图:


兑现代码:
#include <iostream>
#include <string>
#include "list"
using namespace std;

class IFile
{
public:
	virtual void display()=0;
	virtual int add(IFile *ifile)=0;
	virtual int remove(IFile *ifile)=0;
	virtual list<IFile*>* getChild()=0;
};
class File :public IFile
{
public:
	File(string name)
	{
		m_name=name;
	}
	virtual void display()
	{
		cout<< m_name<<endl;
	}
	virtual int add(IFile *ifile)
	{
		return -1;
	}
	virtual int remove(IFile *ifile)
	{
		return -1;
	}
	virtual list<IFile*>* getChild()
	{
		return NULL;
	}
private:
	string m_name;
};
//目录节点
class Dir :public IFile
{
public:
	Dir(string name)
	{
		m_name=name;
		m_list = new list<IFile*>;
	}
	virtual void display()
	{
		cout<< m_name<<endl;
	}
	virtual int add(IFile *ifile)
	{
		m_list->push_back(ifile);
		return 0;

	}
	virtual int remove(IFile *ifile)
	{
		m_list->remove(ifile);
		return 0;
	}
	virtual list<IFile*> * getChild()
	{
		return m_list;
	}
private:
	string m_name;
	list<IFile*> *m_list;
};
void showTree(IFile*root,int level)
{
	//递归的显示
	if(root==NULL)
	{
		return ;
	}
	int i=0;

	for(i=0;i<level;i++)
	{
		printf("\t");
	}
	root->display();
	
	list<IFile*> *list1 = root->getChild();
	if(list1!=NULL)//C盘下有东西可能是文件也可能是目录,可能都有
	{	
		for(list<IFile*>::iterator it = list1->begin();it!=list1->end();it++)
		{
			if((*it)->getChild()==NULL)//说明是文件
			{
				for(i=0;i<=level;i++)
				{
					printf("\t");
				}
				(*it)->display();
			}
			else//说明是目录
			{

				showTree(*it,level+1);
			}
			
		}
	}

}
void main()
{
	Dir *root = new Dir("C:");
	Dir *dir1 = new Dir("dir1");
	Dir *dir2 = new Dir("dir2");

	File *file1 = new File("file1");
	File *file2 = new File("file2");
	//往目录c盘下添加文件和目录
	root->add(dir1);
	root->add(file1);
	dir1->add(file2);
	dir1->add(dir2);
	//root->display();
	//获取root下的集合
	list<IFile*> *list1 = root->getChild();

	showTree(root,0);

	cout<<"nihao..."<<endl;
	system("pause");
	return ;
}
运行结果:


Inception-Resnet-v1、Inception-Resnet-v2学习笔记(附Pytorch代码)_inception-resnet-v1 代码 Reduction-B模块:输入8*8*1792,输出8*8*1792.IR-B模块*10:输入17*17*896,输出17*17*896.IR-A模块*5:输入35*35*256,输出35*35*256.IR-A模块*5:输入35*35*384,输出35*35*256.IR-B模块*10:输入17*17*896,输出8*8*1792.IR-C模块*5:输入8*8*1792,输出8*8*1792.IR-C模块*5:输入8*8*1792,输出8*8*1792. 阅读详情

相关推荐

C++ 设计模式

设计模式代表了最佳的实践,在面向对象的编程中被很多老鸟们反复使用。使用设计模式有很多好处:可重用代码、保证代码可靠性、使代码更易被他人理解 ......

青春不老,奋斗不止! 9万+

设计模式内容分享(十):组合模式

组合模式是一种解决树状问题的结构型模式,再使用过程中需要有较强的层次结构,在实现时要注意树枝节点的特有接口以及含有内部属性 List,List里面放 Component。

之乎者也·的博客 3509

C++设计模式8:组合模式

组合模式是一种结构型设计模式,它将对象组织成树形结构以表示“部分-整体”的层次结构,使得用户可以以一致的方式处理单个对象和对象组合。在组合模式中,有两种类型的对象:叶子对象和组合对象。叶子对象是指没有子对象的对象,而组合对象则是具有子对象的对象。这些对象被组织成一个树形结构,其中组合对象作为父节点,而叶子对象作为子节点。这种层次结构可以无限扩展。组合模式可以让我们更方便地处理复杂对象的组合和操作。它提供了一种统一的方式来访问和管理对象集合,无论这些对象是单个对象还是对象的组合。

琅嬛福地 923

C++设计模式(全23种)

设计模式概述 设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。等这种思想融入到了思想中后,你就会不自觉地使用这种思想去进行你的设计和开发。 文章目录设计模式概述一、创建型模式Factory 模式(工厂模式)AbstactFactory 模式(抽象工厂模式)Singleton 模式( 单例模式)Builder 模式(建造者模式)Prototype 模式(原型模式)二、结构型模式Bridge 模式(桥接模式)总结

weixin_45712636的博客 9万+

细数C++的各种设计模式

访问者模式是一种行为型设计模式,它定义了在不改变对象结构的情况下对集合中的元素进行操作的方式。代理模式是一种结构模式,通过在对象之间提供一个代理对象来控制对象的访问。命令模式是一种行为型模式,将请求封装成对象,使得可以使用不同的请求、日志、事务和支持撤销操作的操作来对请求进行参数化。模板方法模式是一种行为型设计模式,它定义了一个算法的骨架,允许子类重写特定方法的实现,而不改变算法的结构。观察者模式是一种行为型模式,用于在对象之间定义一对多的依赖关系,以便当对象的状态发生改变时通知其他对象。

2301_78032663的博客 2566

C++ 常用设计模式(学习笔记)

设计模式 1、工厂模式 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。工厂模式作为一种创建模式,一般在创建复杂对象时,考虑使用;在创建简单对象时,建议直接new完成一个实例对象的创建。 1.1、简单工厂模式 主要特点是需要在工厂类中做判断,从而创造相应的产品,当增加新产品时,需要修改工厂类。使用简单工厂模式,我们只需要知道具体的产品型号就可...

duchengjun的博客 1899

C++设计模式——组合模式(Composite Pattern)

C++设计模式——组合模式 微信公众号:幼儿园的学霸 目录 文章目录C++设计模式——组合模式目录定义定义结构代码示例总结使用场景及注意事项优缺点参考资料 定义 定义 Compose objects into tree structures to represent part-whole hierarchies.Composite lets clients treat individual objects and compositions of objects uniformly. 将对象组合成树形结

leonardohaig的博客 1571

c++设计模式11】结构型3:组合模式(Composite Pattern)

组合模式(Composite Pattern)是一种结构型设计模式,通过将对象组合成树状结构来表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性,可以一致地处理组合对象和叶子对象。

junxuezheng的博客 1305

【20】c++设计模式——>组合模式

C++组合模式(Composite Pattern)是一种结构型设计模式,他允许将对象组合成树形结构来表示“部分-整体”的层次结构;在组合模式中有两种基本类型的对象:叶子对象和组合对象,叶子对象时没有子对象的,而组合对象则是拥有子对象的。叶子对象和组合对象都实现了相同的接口,以便可以用相同的方式处理他们。

weixin_42097108的博客 961

C++设计模式——组合模式(composite pattern)

# 一、原理讲解 ## 1.1意图 将对象组合成树形结构以表示“部分 — 整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。 ## 1.2应用场景 - 你想表示对象的部分 — 整体层次结构; - 你

净无邪博客 1129

C++ 设计模式 —— 组合模式

组合模式的定义组合模式的作用组合模式是一种行为型设计模式,它将对象组合成树形结构以表示部分 - 整体的层次结构。这种模式使得用户对单个对象和组合对象的使用具有一致性。组合模式主要应用于需要表示复杂对象结构或者需要将对象组合成树形结构的场景。组合模式的定义和作用:定义:组合模式通过一种巧妙的设计方案,可以一致性地处理整个树形结构或者树形结构的一部分,也可以一致性地处理树形结构中的叶子节点(不包含子节点的节点)和容器节点。

莫寒技术人生 1617

设计模式组合模式 C++实现

文章目录前言1. 组合模式理解2. 组合模式C++实现总结参考 前言 今天复习了组合模式,实现了对象间树形结构关系,这里给大家分享下。 1. 组合模式理解 组合模式,顾名思义,通过组合关系定义类间的关联关系,实现了将对象组合成树形结构,最终实现类的复用。可能是由于设计模式看的多了,初看组合模式的类图,感觉和装饰者模式类图很相似,都是使用继承和组合关系,当然,也只是结构相似而已。 组合模式正规定义与类图(引用《大话设计模式》)如下所示: 2. 组合模式C++实现 这里以公司在不同地区有分部,不同城市

DU_YULIN的博客 1372

C++ 设计模式组合模式

C++ 设计模式组合模式

L_qingting的博客 499

C++设计模式总结

一、单例模式 一个类不管常见多少次对象,永远只能得到该类型一个对象的实例 // p1、p2、p3指向同一对象 A* p1 = new A(); A* p2 = new A(); A* p3 = new A(); 饿汉式单例模式: 还没有获取实例对象,实例对象就已经产生了 优点:线程安全。对象存放在数据段,main函数还没有开始执行,对象就已经初始化好了,一定是线程安全的。 缺点: 获取在软件启动的时候,并没有使用到这个对象,然而这个对象已经产生,这就比较浪费资源。 #include<iostream

长期更新自学笔记 5232

C++:23种设计模式

设计模式是软件设计中常用的解决方案,分为三大类:创建型模式、结构型模式和行为型模式。以下是23种设计模式的简要介绍和C++代码示例。提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。public:public:public:public:public:public:设计模式是软件工程中的一种最佳实践,它们提供了在特定情境下解决常见设计问题的模板。设计模式分为三大类:创建型模式、结构型模式和行为型模式

weixin_53442127的博客 6775

c++设计模式

c++设计模式

m0_72814368的博客 2995

组合模式(Composite Pattern)

组合设计模式是一种结构型设计模式,又名部分整体模式,是用于把一组相似的对象当作一个单一的对象。它允许客户端以统一的方式处理单个对象和组合对象。该模式将对象组合成树形结构,以表现“部分-整体”的关系。如图我们可以看做是一个文件系统,对于这样的结构我们称之为树形结构。在树形结构中可以通过调用某个方法来遍历整个树,当我们找到某个叶子节点后,就可以对叶子节点进行相关的操作。可以将这颗树理解成一个大的容器,容器里面包含很多的成员对象,这些成员对象即可是容器对象也可以是叶子对象。

qq_53868937的博客 1706

Java设计模式总结

这里总结了23种设计模式的结构图及定义,样例代码在 Github:studeyang/design-pattern。工厂方法模式,定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。抽象工厂模式,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。原型模式,用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。建造者模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。单例模式,保证一个类仅有一个实例,并提供一个访问

一如既往的准备文章 944

【论文解读--Xdog】新型电驱式四足机器人研制与测试

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录系列文章目录前言一、四足机器人体型大小和驱动方式的比较二、四足机器人设计一些重要的结论三、系统控制框架四、系统硬件框架五、力位混合控制(阻抗控制)六、侧向平衡控制(和VMC如出一辙)七、电机驱动系统研制(FOC磁场定向控制)总结 前言 认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长! 本文先对新型电驱式四足机器人研制与测试做个简单的介绍,具体内容后续再更,其他模块可以参

qq_35635374的博客 3670

IDC行业资讯大全.rar

中国IDC行业资讯大全(2010年版)是一本深入中国IDC产业的工具书,内容上集合了行业动态、技术解析、解决方案、机房展示、运营商及企业名录、互联网热门行业名录等相关内容,本书通过整合IDC产业的上下游的各环节的资讯及技术,整合整个IDC产业的信息链。《大全》内容概要:◆行业动态:以事件发生时间的先后逆序排列,每件大事后面都有简短的评论。(编委会评论,主要是来自中国IDC圈的原创评论) ◆研究报告:汇集CNNIC、中国互联网协会、中国IDC圈、赛迪顾问、艾瑞集团、中国IT实验室、互联网观察中心等调研机构在互联网应用、Hosting、IDC等专业方向的数据报告。针对当前IDC行业状况,由业内资深人士撰写的研究报告,可为IDC行业内的企业、代理商提供最具价值的参考和指导…… ◆技术解析:技术解析:报道当前IDC行业最前沿的技术,为IDC企业和用户传递最新的技术资讯。包括CDN、VPS、IPv6、云计算、虚拟化、绿色科技等。 ◆解决方案:解决方案:展示大中小企业信息化解决方案,涵盖数据中心建设方案,网游IDC解决方案,视网站解决方案,互联网门户解决方案,电子商务解决方案,南北互联解决方案,IDC网络安全解 决方案等等,为广大IDC用户提供最具权威性的技术性指导……◆机房展示:依靠中国IDC圈的权威行业平台,与各大电信运营商及中立电信运营企业进行合作,通过 多种渠道方式对机房信息进行收录、确认,给消费者呈现一个真实的软硬件机房环境。◆企业名录:收录全国34个省、市、直辖市近2000家Hosting、IDC企业及运营商,企业内容包括:网站名称、单位名称、主营业务、详细地址、邮政编码、电话、传真、邮件、网址等,内容详实,该名录将成为中国最为权威、涉及面最广泛、内容最准确的IDC企业“信息宝典”。◆政策法规:政策法规:为IDC业内的企业及代理服务商提供归纳出国务院及工业与信息产业部最期出台的一系列的政策法规,在原基础上增加电子商务和SNS网站相关政策法规 ,为IDC行业的健康持续快速发展保驾护航……

上一篇: 类与类间的关系
下一篇: c++设计模式之外观模式
BUS375
博客等级 码龄14年 105粉丝 167原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值