组合模式——C++实现

news/2025/1/6 5:27:01/

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;
}

运行结果如下:

打印出了目录结构。

比较简单,使用场景也比较受限,出场机会不多。


http://www.ppmy.cn/news/1560564.html

相关文章

Android多渠道打包【友盟方式详细讲解版】

开发环境&#xff1a; Mac OS 15.0.1 Android Studio Jellyfish | 2023.3.1 Patch 2 废话不讲&#xff0c;不浪费大家时间&#xff0c;每步骤后面有解释&#xff0c;直接开始上手干 第一步&#xff1a; 在程序的清单文件【app/src/main/AndroidManifest.xml】配置如下节点内容…

SCAU软件体系结构期末复习-名词解释题

名词解释 软件设计模式&#xff1a; 是对软件设计经验的总结&#xff0c;是对软件设计中反复出现的设计问题的成功解决方案的描述。为了记录这些成功的设计经验并方便以后使用&#xff0c;软件设计模式通常包含4个基本要素&#xff1a;模式名称、问题、解决方案以及效果。它最…

【GeekBand】C++设计模式笔记20_Composite_组合模式

1. “数据结构” 模式 常常有一些组件在内部具有特定的数据结构&#xff0c;如果让客户程序依赖这些特定的数据结构&#xff0c;将极大地破坏组件的复用。这时候&#xff0c;将这些特定数据结构封装在内部&#xff0c;在外部提供统一的接口&#xff0c;来实现与特定数据结构无…

Segment Anything论文详细翻译【Part1:作者+Figure1+摘要】

目录 写在前面 标题 作者 Alexander Kirillov Eric Mintun Nikhila Ravi Hanzi Mao 其他作者 发表机构 Figure 1 任务 模型 数据 摘要 翻译 写在前面 为啥要写这篇文章&#xff1f;因为找不到一篇写的特别好的【翻译并仔细解释】文章。网上大多千篇一律&#x…

[react]小技巧, ts如何声明点击事件的类型

很简单, 鼠标放到事件上面就行了 如果想知道点击的是什么元素 ,打印他的nodename就行了 不过得断言为html元素才行 const handleClick (e: React.MouseEvent<HTMLDivElement, MouseEvent>) > {console.log(current, (e.target as HTMLElement).nodeName);}; 为什么…

[ubuntu-22.04]ubuntu不识别rtl8153 usb转网口

问题描述 ubuntu22.04插入rtl8153 usb转网口不识别 解决方案 安装依赖包 sudo apt-get install libelf-dev build-essential linux-headers-uname -r sudo apt-get install gcc-12 下载源码 Realtek USB FE / GBE / 2.5G / 5G Ethernet Family Controller Softwarehttps:/…

leetcode 面试经典 150 题:多数元素

链接多数元素题序号169题型数组解法1. 排序法、2. Boyer-Moore投票算法难度简单熟练度✅✅✅✅✅ 题目 给定一个大小为 n 的数组 nums &#xff0c;返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的…

机器学习之逻辑回归算法、数据标准化处理及数据预测和数据的分类结果报告

逻辑回归算法、数据标准化处理及数据预测和数据的分类结果报告 目录 逻辑回归算法、数据标准化处理及数据预测和数据的分类结果报告1 逻辑回归算法1.1 概念理解1.2 算法导入1.3 算法优缺点 2 LogisticRegression理解2.1查看参数定义2.2 参数理解2.3 方法2.4基本格式 3 数据标准…