组合模式——C++实现
1. 模式简介
组合模式是一种结构型模式。
组合模式又叫做部分整体模式,组合模式用于把一组相似的对象当做一个单一的对象。特别擅长处理树形的数据,对于非树形的数据不好用它。
对于树形的数据,一个典型的例子就是文件系统。在文件系统里大致上可以分为文件夹和文件两种类型的数据。文件夹中可以包含文件也可以包含其他文件夹。就像下面这张图一样,文件的组织就像一颗多叉树。

如果使用组合模式来实现类似tree命令的文件名打印,UML类图如下:

比较简单,不详细说了,直接看下面的代码吧,兄弟们
2. 代码示例
#include <iostream>
#include <string>
#include <vector>using namespace std;class FileSystem
{
public:FileSystem(string name) : m_name(name) {}virtual ~FileSystem() {}virtual void show(int level = 0)=0;virtual bool addFile(FileSystem* file)=0;
protected:string m_name;
};class File : public FileSystem
{
public:File(string name) : FileSystem(name) {}void show(int level = 0){for (int i = 0; i < level; i++)cout << " ";cout << "- " << m_name << endl;}bool addFile(FileSystem* file) { return false; }
};class Directory : public FileSystem
{
public:Directory(string name) : FileSystem(name) {}void show(int level = 0){for (int i = 0; i < level; i++)cout << " ";cout << "+ " << m_name << endl;for (int i = 0; i < m_files.size(); i++)m_files[i]->show(level + 1);}bool addFile(FileSystem* file){if (file == NULL)return false;m_files.push_back(file);return true;}
private:vector<FileSystem*> m_files;
};int main()
{Directory* root = new Directory("root");Directory* dir1 = new Directory("dir1");Directory* dir2 = new Directory("dir2");File* file1 = new File("file1");File* file2 = new File("file2");File* file3 = new File("file3");root->addFile(dir1);root->addFile(dir2);dir1->addFile(file1);dir1->addFile(file2);dir2->addFile(file3);root->show();delete root;delete dir1;delete dir2;delete file1;delete file2;delete file3;return 0;
}
运行结果如下:

打印出了目录结构。
比较简单,使用场景也比较受限,出场机会不多。
相关文章:
组合模式——C++实现
1. 模式简介 组合模式是一种结构型模式。 组合模式又叫做部分整体模式,组合模式用于把一组相似的对象当做一个单一的对象。特别擅长处理树形的数据,对于非树形的数据不好用它。 对于树形的数据,一个典型的例子就是文件系统。在文件系统里大致…...
【开源监控工具】Uptime Kuma:几分钟设置实时监控你的网站性能
文章目录 前言1.关于Uptime Kuma2.安装Docker3.本地部署Uptime Kuma4.使用Uptime Kuma5.cpolar内网穿透工具安装6.创建远程连接公网地址7.固定Uptime Kuma公网地址 前言 大家好!如果你是网站运维人员或者管理着多个站点,那么今天我要介绍的一款工具绝对…...
MATLAB画柱状图
一、代码 clear; clc; figure(position,[150,100,900,550])%确定图片的位置和大小,[x y width height] %准备数据 Y1[0.53,7.9,8.3;0.52,6.8,9.2;0.52,5.9,8.6;2.8,5.8,7.9;3.9,5.2,7.8;1.8,5.8,8.4]; % withoutNHC X11:6; %画出4组柱状图,宽度1 h1…...
stm32内部flash在线读写操作
stm32内部flash在线读写操作 📍相关开源库文章介绍《STM32 利用FlashDB库实现在线扇区数据管理不丢失》 ✨不同系列,内部flash编程有所区别。例如stm32f1是按照页擦除,半字(16bit)或全字(32bit)数据写入;st…...
SpringCloud源码分析-nacos与eureka
一、高版本为什么优先用nacos 如果用alibaba springcloud,那么就是阿里的技术体系。nacos属于阿里的原生技术栈,所以阿里更偏向于用nacos作为服务发现注册。 二、对比分析 Spring Cloud Alibaba 推荐使用 Nacos 作为服务发现和配置管理的首选组件&…...
DCGAN模型详解
模型背景 在深度学习领域迅速发展的背景下,生成对抗网络(GAN)作为一种革命性的生成模型应运而生。 Ian Goodfellow等人于2014年首次提出GAN概念 ,开创了生成模型的新纪元。这一创新源于对深度学习在图像生成方面潜力的探索,旨在解决非监督学习中的关键问题:如何让机器创造…...
单片机-蜂鸣器实验
#include "reg52.h" typedef unsigned char u8; typedef unsigned int u16; sbit BEEPP2^5; //将 P2.5 管脚定义为 BEEP P2.5默认高电平 void delay_10us(u16 ten_us){ while(ten_us--); } void main() { u16 i2000;//脉冲2000次 while(1) { …...
SQL 分析函数与聚合函数的组合应用
目标:掌握 SQL 中分析函数(窗口函数)与聚合函数的组合使用,通过实际案例实现复杂业务需求,如同比、环比和趋势分析。 1. 分析函数与聚合函数的区别 聚合函数(Aggregate Functions):…...
【项目】基于趋动云平台的Stable Diffusion开发
【项目】基于趋动云平台的Stable Diffusion开发 (一)登录趋动云(二)创建项目:(三)初始化开发环境:(四)运行代码(五)运行模型 …...
游戏如何检测iOS越狱
不同于安卓的开源生态,iOS一直秉承着安全性更高的闭源生态,系统中的硬件、软件和服务会经过严格审核和测试,来保障安全性与稳定性。 据FairGurd观察,虽然iOS系统具备一定的安全性,但并非没有漏洞,如市面上…...
【AIGC-ChatGPT进阶提示词指令】AI美食助手的设计与实现:Lisp风格系统提示词分析
引言 在人工智能助手的应用领域中,美食烹饪是一个既专业又贴近生活的方向。本文将详细分析一个基于Lisp风格编写的美食助手系统提示词,探讨其结构设计、功能实现以及实际应用效果。 提出你的菜系,为你分析,并生成图片卡片 提示词…...
库伦值自动化功耗测试工具
1. 功能介绍 PlatformPower工具可以自动化测试不同场景的功耗电流,并可导出为excel文件便于测试结果分析查看。测试同时便于后续根据需求拓展其他自动化测试用例。 主要原理:基于文件节点 coulomb_count 实现,计算公式:电流&…...
Javascript数据结构——图Graph
当然,让我们深入探讨一下JavaScript中的图数据结构,并列出一些常见的面试题及其代码示例。 图数据结构详解 图(Graph)是一种非线性的数据结构,由节点(也称为顶点)和连接这些节点的边组成。节点…...
搭建nginx文件服务器
方法一:通过docker方式搭建 1、创建一个nginx配置文件/etc/nginx/nginx.conf user nginx; worker_processes 1;error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid;events {worker_connections 1024; }http {include mime.types;default_typ…...
Ubuntu Server安装谷歌浏览器
背景 服务器上跑爬虫服务器需要安装谷歌浏览器 安装 wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb### sudo apt install ./google-chrome-stable_current_amd64.deb...
Vue项目结构推荐(复杂国际化项目与一般项目结构)
Vue项目结构推荐 一、一般项目结构二、复杂国际化项目结构总结/建议 下面结构是基于Vue和TypeScript开发的项目结构下src包下的结构,若只用到vue与js。则去掉typescript部分的包即可。 一、一般项目结构 assets:存放静态资源,如图片、字体、样…...
hive-sql 连续登录五天的用户
with tmp as (select 梁牧泽 as uid, 2023-03-03 as dt union allselect 梁牧泽 as uid, 2023-03-04 as dt union allselect 梁牧泽 as uid, 2023-03-05 as dt union allselect 梁牧泽 as uid, 2023-03-07 as dt union allselect 梁牧泽 as uid, 2023-03-08 as dt union allsel…...
FPGA 4x4矩阵键盘 实现
1原理 FPGA(现场可编程门阵列)4x4矩阵键盘的实现原理主要基于行列扫描法,通过FPGA对键盘的扫描和识别,实现对键盘输入信号的采集和处理。以下是对FPGA 4x4矩阵键盘实现原理的详细解释: 一、矩阵键盘的基本原理 结构:4x4矩阵键盘由4行和4列组成,共16个按键。每个按键位…...
ruoyi开发学习
将若依框架中的若依元素删掉 1.删除主目录中的“若依官网”: 在后端项目中,idea里借助mysql管理工具,找到sys_menu数据表,双击打开,找到4 若依官网,选中点击减号,绿色上箭头刷新,删…...
MacBook_Xcode_Swift雨燕
Swift Swift Swift Swift是苹果公司开发的现代化编程语言, 专为Apple平台设计。其简洁语法、类型安全、Optionals处理、Playgrounds交互式环境、泛型编程、协议与扩展、闭包功能、枚举与关联值、结构体与类的高效内存管理、异步编程的async/await语法、Swift Packa…...
XposedRimetHelper:如何优雅解决远程办公的定位打卡难题?[特殊字符]
XposedRimetHelper:如何优雅解决远程办公的定位打卡难题?🚀 【免费下载链接】XposedRimetHelper Xposed 钉钉辅助模块,暂时实现模拟位置。 项目地址: https://gitcode.com/gh_mirrors/xp/XposedRimetHelper 面对企业日益严…...
FigmaCN:解决Figma英文界面障碍的设计师专属中文方案
FigmaCN:解决Figma英文界面障碍的设计师专属中文方案 【免费下载链接】figmaCN 中文 Figma 插件,设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN 作为一名设计师,您是否曾因Figma全英文界面而减慢工作流程&…...
springboot+vue基于web的演唱会音乐会购票管理系统设计系统
目录同行可拿货,招校园代理 ,本人源头供货商系统功能模块分析技术架构设计核心业务流程安全防护措施项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作同行可拿货,招校园代理 ,本人源头供货商 系统功能模块分析 用户模块 注册登…...
PFC5.0代码:含三种矿物组成的岩石或类岩石材料GBM单轴压缩2d算例代码,仅供学习与提升
PFC5.0代码,含三种矿物组成的岩石或者类岩石材料,GBM,单轴压缩2d,算例代码仅供学习以及提升 打开PFC5.0的建模界面,突然想把花岗岩里的石英、长石、云母做成颗粒组合。先整点暴力的——直接拿球体颗粒拼成矿物晶粒&…...
进程间通信(IPC):原理、场景与选型
在操作系统的世界里,进程是程序运行的基本单元,每个进程都拥有独立的内存空间和资源,彼此之间相互隔离,无法直接访问对方的数据。这种隔离机制保证了系统的稳定性,避免进程间相互干扰,但也带来了一个问题&a…...
Graphormer在药物发现中的应用:催化剂吸附预测落地实践
Graphormer在药物发现中的应用:催化剂吸附预测落地实践 1. 项目背景与价值 在药物研发和材料科学领域,分子属性预测一直是一项耗时且昂贵的任务。传统实验方法需要大量试错,而计算化学方法又面临精度与效率的平衡问题。Graphormer作为一款基…...
Stable Diffusion v1.5 Archive 镜像实测:5步完成部署,快速体验文生图
Stable Diffusion v1.5 Archive 镜像实测:5步完成部署,快速体验文生图 1. 开篇:为什么选择SD1.5 Archive版本 Stable Diffusion作为当前最热门的开源AI绘画模型,已经迭代了多个版本。其中v1.5作为经典版本,在图像质量…...
Java如何实现Excel表格中间插入列
在日常Excel数据处理中,通常需要调整表格结构,例如在特定列之间插入新列。本文将介绍如何有效地使用Java代码,特别是在现有的A列和B列之间插入新列。Excel文件的高效处理,避免直接操作二进制数据带来的复杂性和错误风险࿰…...
Palo Alto PAN-OS 12.1.5 VM-Series for ESXi, KVM - 基于机器学习的下一代防火墙操作系统
Palo Alto PAN-OS 12.1.5 Orion 发布 - 基于机器学习的下一代防火墙操作系统 PAN-OS 12.1 Orion delivers industry firsts including quantum readiness, unified multi-cloud protection, and more. 请访问原文链接:https://sysin.org/blog/pan-os-12/ 查看最新…...
ComputeSharp未来展望:GPU计算在.NET生态中的发展路线图
ComputeSharp未来展望:GPU计算在.NET生态中的发展路线图 【免费下载链接】ComputeSharp A .NET library to run C# code in parallel on the GPU through DX12, D2D1, and dynamically generated HLSL compute and pixel shaders, with the goal of making GPU comp…...
