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

news2024/9/25 21:31:19

组合模式定义

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

简单的C++组合模式实例

#include <iostream>
#include<vector>

//抽象基类,定义组合对象和叶子对象的公共接口,
class Component
{
public:
	//纯虚函数,需要子类实现,
	virtual void operation() = 0;
};

//叶子对象,无子对象,实现Component接口
class Leaf :public Component
{
public:
	void operation() override
	{
		std::cout << "Lead operation" << std::endl;
	}
};
//组合对象,拥有子对象,实现Component接口
class Composite :public Component
{
public:
	//添加子对象到子对象列表中
	void add(Component* component)
	{
		children.push_back(component);
	}
	void operation() override
	{
		std::cout << "Composite operation" << std::endl;
		for (auto child : children)
		{
			child->operation();
		}
	}
private:
	std::vector<Component*>children; //子对象列表
};
int main()
{
	Leaf leaf;
	 
	Composite composite;
	composite.add(&leaf);
	composite.add(&leaf);
	composite.add(&leaf);

	composite.operation();
	return 0;

}

在这里插入图片描述

文件系统来演示组合模式

我们以一个文件系统为例,使用组合模式来表示文件系统中的目录文件的关系

#include <iostream>
#include<string>
#include<vector>

//抽象基类,定义了组合对象和叶子对象的公共接口
class FileSystemComponent
{
public:
	virtual void showInfo() = 0;
	virtual ~FileSystemComponent() {};
};
//叶子对象:文件
class File :public FileSystemComponent
{
public:
	File(const std::string& name) :m_Name(name) {}
	void showInfo() override
	{
		std::cout << "File:" << m_Name << std::endl;
	}
private:
	std::string m_Name;
};

//组合对象:目录
class Directory :public FileSystemComponent
{
public:
	Directory(const std::string& name) :m_Name(name) {}
	void add(FileSystemComponent* com)
	{
		children.push_back(com);
	}

	void showInfo() override
	{
		std::cout << "Directory:" << m_Name << std::endl;
		for (auto& item : children)
		{
			item->showInfo();
		}
	}

private:
	std::string m_Name;
	std::vector<FileSystemComponent*> children;
};

int main()
{
	Directory root("root"); //根节点
	Directory mnt("mnt");
	Directory tmp("tmp");

	root.add(&mnt);
	root.add(&tmp);

	File ext("ext");
	File nfs("nfs");

	mnt.add(&ext);
	tmp.add(&nfs);

	root.showInfo();

	return 0;
	
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1074290.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【ARM Coresight 系列文章19 -- Performance Monitoring Unit(性能监测单元)

文章目录 1.1 PMU 介绍1.2 PMU 寄存器1.2.1 PMU 管理寄存器1.2.2 PMU 外设识别寄存器1.2.3 PMU 组件识别寄存器1.3 性能监控事件1.3.1 Cortex-A9 特定事件1.1 PMU 介绍 许多体系结构都包含 PMU(Performance Monitoring Unit)硬件,用于跟踪、计数系统内部的一些底层硬件事件…

【四旋翼飞行器】模拟四旋翼飞行器的平移和旋转动力学(Simulink仿真实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

vue-router 详解

可参见: vue-router 详解_vue router_七月J的博客-CSDN博客 https://www.cnblogs.com/chen-ao666/p/17144552.html vue-router的使用 使用vue-router的步骤: 创建路由组件 配置路由映射: 组件和路径映射关系 使用路由: 通过和 <router-link>: 该标签是一个vue-router中…

云原生边缘计算KubeEdge安装配置(二)

1. K8S集群部署&#xff0c;可以参考如下博客 请安装k8s集群&#xff0c;centos安装k8s集群 请安装k8s集群&#xff0c;ubuntu安装k8s集群 请安装kubeedge cloudcore centos安装K8S 2.安装kubEedge 2.1 编辑kube-proxy使用ipvs代理 kubectl edit configmaps kube-proxy -…

电子电路学习笔记——LDO稳压器 NCP114ASN330T1G的应用

关于LDO稳压器&#xff08;Low-Dropout Regulator&#xff09;&#xff1f; 是一种用于电源管理的集成电路&#xff0c;常用于将高电压转换为较低且稳定的工作电压。LDO稳压器可以在输入电压几乎等于输出电压的情况下工作&#xff0c;因此它们具有较低的压降&#xff08;dropo…

leetcode797. 所有可能的路径(java)

所有可能的路径 题目描述图的遍历 题目描述 难度 - 中等 leetcode797. 所有可能的路径 给你一个有 n 个节点的 有向无环图&#xff08;DAG&#xff09;&#xff0c;请你找出所有从节点 0 到节点 n-1 的路径并输出&#xff08;不要求按特定顺序&#xff09; graph[i] 是一个从节…

伦敦银最新走势不利怎么办

跟其他的投资品种一样&#xff0c;伦敦银的价格走势在不停的变化&#xff0c;而且由于本身产品具有较高的资金杠杆&#xff0c;所以万一行情走势变得不利&#xff0c;在很短的时间之内就会对投资者的账户造成严重损失&#xff0c;所以投资者应该对此作好充分的准备。 伦敦银的最…

开源ERP和CRM套件Dolibarr

什么是 Dolibarr &#xff1f; Dolibarr ERP & CRM 是一个现代软件包&#xff0c;用于管理您组织的活动&#xff08;联系人、供应商、发票、订单、库存、议程…&#xff09;。它是开源软件&#xff08;用 PHP 编写&#xff09;&#xff0c;专为中小型企业、基金会和自由职业…

什么是云计算?云计算简介

其实“云计算”作为一个名词而言&#xff0c;那是相当成功滴。很多人都有听过。但提及云计算”具体是什么?很多人&#xff0c;知其然&#xff0c;却不知其所以然! 利用软件将这些成千上万不可靠的硬件组织成一个稳定可靠的IT系统&#xff0c;以此支撑其公司的IT基础服务。这家…

如何找到新媒体矩阵中存在的问题?

随着数字媒体的发展&#xff0c;企业的新媒体矩阵已成为品牌推广和营销的重要手段之一。 然而&#xff0c;很多企业在搭建新媒体矩阵的过程中&#xff0c;往往会忽略一些问题&#xff0c;导致矩阵发展存在潜在风险&#xff0c;影响整个矩阵运营效果。 因此&#xff0c;找到目前…

如何在抖音做到种收合一?「星推搜直」新路径激发生意增量

数字化时代&#xff0c;复杂无序的媒介信息触点&#xff0c;让消费者的购买决策和心智建设路径&#xff0c;从“认知-认同-认购”的线性漏斗式逐渐发展为跳跃式、多线并进&#xff0c;种草到转化的路径上充满各种可能。与此同时&#xff0c;在抖音&#xff0c;从通过短视频、直…

JVM 参数

JVM 参数类型大致分为以下几类&#xff1a; 标准参数&#xff08;-&#xff09;&#xff1a;保证在所有的 JVM 实现都支持的参数非标准参数&#xff08;-X&#xff09;&#xff1a;通用的&#xff0c;特定于 HotSpot 虚拟机的参数&#xff0c;这些参数不保证在所有 JVM 实现中…

【C/C++】指针函数与函数指针

1、指针函数--指针作为函数的返回值 指针函数本质是一个函数&#xff0c;只不过函数的返回值是一个指针 #include <stdio.h> #include <malloc.h> #include <string.h>char * funGetString(); int main() {char * sentence funGetString();printf(" %…

http 详解 三 http首部各字段意义

HTTP 首部 HTTP 报文首部 HTTP 请求报文 下面的示例是访问 http://hackr.jp 时&#xff0c;请求报文的首部信息。 GET / HTTP/1.1 Host: hackr.jp User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko/20100101 Firefox/13.0 Accept: text/html,application/x…

Linux: alsa-lib 插件简介

文章目录 1. 前言2. 分析背景3. Linux ALSA 框架4. alsa 声卡设备5. alsa-lib 简介5.1 alsa-lib 插件5.1.1 alsa-lib 插件概览5.1.2 alsa-lib 插件工作细节5.1.2.1 插件对象的创建和初始化5.1.2.2 插件对象处理数据的过程 5.1.3 alsa-lib 内置插件代码组织5.1.4 自定义 alsa-li…

家政服务行业做开发微信小程序可以实现什么功能

家政服务行业开发微信小程序可以实现多种功能&#xff0c;从而提升服务品质和效率&#xff0c;下面我们来详细介绍一些可能实现的功能。 一、展示服务信息 家政服务微信小程序可以展示各种服务信息&#xff0c;包括各类家政服务项目、价格、服务流程、服务人员信息等。用户可以…

Android多线程学习:线程池(二)

一、线程池运行流程 具体执行流程如下&#xff1a; 1、首先检测线程池运行状态&#xff0c;如果不是RUNNING&#xff0c;则直接拒绝&#xff0c;线程池要保证在RUNNING的状态下执行任务&#xff1b; 2、如果workerCount < corePoolSize&#xff0c;则创建并启动一个线程来…

12. Java异常及异常处理处理

Java —— 异常及处理 1. 异常2. 异常体系3. 常见Exception4. 异常处理4.1 try finally catch关键字4.2 throws和throw 自定义异常4.3 finally&#xff0c;final&#xff0c;finalize三者的区别 1. 异常 异常&#xff1a;在程序执行过程中发生的意外状况&#xff0c;可能导致程…

使用Pritunl OpenVPN远程连接,实现安全高效的远程访问

文章目录 前言1.环境安装2.开始安装3.访问测试4.创建连接5.局域网测试连接6.安装cpolar7.配置固定公网访问地址8.远程连接测试 前言 Pritunl是一款免费开源的 VPN 平台软件&#xff08;但使用的不是标准的开源许可证&#xff0c;用户受到很多限制&#xff09;。这是一种简单有…

印度网络安全:威胁与应对

随着今年过半&#xff0c;我们需要评估并了解不断崛起的网络威胁复杂性&#xff0c;这些威胁正在改变我们的数字景观。 从破坏性的网络钓鱼攻击到利用人工智能的威胁&#xff0c;印度的网络犯罪正在升级。然而&#xff0c;在高调的数据泄露事件风暴中&#xff0c;我们看到了政…