突破编程 C++ 设计模式(组合模式)详尽攻略

在软件开发中,设计模式为程序员提供了解决特定问题的最佳实践。设计模式不仅提高了代码的可复用性和可维护性,还能帮助团队更好地进行协作。在这篇文章中,我们将深入探讨组合模式——一种结构型设计模式。

组合模式允许你将对象组合成树形结构来表示“部分-整体”的层次关系。组合模式使得客户端对单个对象和组合对象的使用具有一致性,这种一致性简化了对复杂树形结构的操作。

1. 组合模式的基本概念

组合模式的核心思想是通过树形结构来实现对象的组合。这种模式非常适用于表示具有部分-整体关系的对象,例如:

  • 文件系统中的文件与文件夹
  • 组织结构图中的员工和部门

当我们需要对一个复杂对象进行管理时,组合模式便提供了一种简洁有效的解决方案。

1.1 组成部分

组合模式通常包含以下几个组成部分:

  • Component(组件):定义所有具体对象和组合对象的接口。
  • Leaf(叶子节点):具体实现的对象,代表树形结构的最下层。
  • Composite(组合节点):包含叶子节点和其他组合节点的对象,真正实现“部分-整体”的结构。

2. 组合模式的结构图

3. 组合模式的优缺点

3.1 优点

  • 简化树形结构的处理:组合模式允许客户端对单个对象和组合对象进行相同的操作,简化了树形结构的处理。
  • 灵活性:新增或删除树形结构中的节点相对容易,代码的可扩展性增强。

3.2 缺点

  • 过度使用:过度使用组合模式可能使系统变得复杂,尤其在层次结构较深时。
  • 性能问题:如果有大量的层级结构,可能会影响性能。

4. 实际操作案例

接下来,通过一个实际案例来展示如何在 C++ 中实现组合模式。

4.1 需求描述

假设我们正在开发一个文件系统的模拟,希望实现一个文件夹和文件的结构。每个文件夹可以包含多个文件和子文件夹,而每个文件夹和文件都可以统一处理。

4.2 类设计

我们将构建以下类:

  • File 类:表示文件。
  • Folder 类:表示文件夹。
  • FileSystemComponent 基类:定义了文件和文件夹的共同接口。

4.3 代码实现

以下是组合模式在 C++ 中的实现代码:

#include <iostream>
#include <string>
#include <vector>
#include <memory>// Component 类
class FileSystemComponent {
public:
virtual void display(int depth) = 0; // 纯虚函数
virtual ~FileSystemComponent() = default; // 虚析构函数
};// Leaf 类
class File : public FileSystemComponent {
private:
std::string name;public:
File(const std::string& name) : name(name) {}void display(int depth) override {
std::cout << std::string(depth, '-') << name << std::endl; // 打印文件名
}
};// Composite 类
class Folder : public FileSystemComponent {
private:
std::string name;
std::vector<std::shared_ptr<FileSystemComponent>> children; // 存储子节点public:
Folder(const std::string& name) : name(name) {}void add(const std::shared_ptr<FileSystemComponent>& component) {
children.push_back(component); // 添加子节点
}void display(int depth) override {
std::cout << std::string(depth, '-') << name << std::endl; // 打印文件夹名
for (const auto& child : children) {
child->display(depth + 2); // 递归调用显示子节点
}
}
};// 示例使用
int main() {
// 创建文件夹与文件
auto root = std::make_shared<Folder>("Root");
auto folder1 = std::make_shared<Folder>("Folder1");
auto folder2 = std::make_shared<Folder>("Folder2");auto file1 = std::make_shared<File>("File1.txt");
auto file2 = std::make_shared<File>("File2.txt");
auto file3 = std::make_shared<File>("File3.txt");// 构造层次结构
root->add(folder1);
root->add(folder2);
folder1->add(file1);
folder1->add(file2);
folder2->add(file3);// 显示文件结构
root->display(0);return 0;
}

4.4 代码解析

  • Component 类:定义了接口以及一个虚析构函数,确保派生类的正确析构。

  • File 类:实现了 FileSystemComponent 接口,表示文件并重写 display 方法以显示文件名。

  • Folder 类:也是 FileSystemComponent 的子类,能够管理文件和文件夹。add 方法用于添加子节点。

  • display 方法:根据深度递归显示文件和文件夹的层次结构。

  • main 函数:构建文件系统的实例并调用 display 方法。

4.5 运行效果

当运行该程序时,输出将会是:

Root
--Folder1
----File1.txt
----File2.txt
--Folder2
----File3.txt

5. 如何正常使用组合模式

组合模式的优雅之处在于其简单和灵活。然而,使用该模式时需要注意以下几点:

  1. 合理设计递归层次:确保组合结构不会过深,以避免性能问题。
  2. 明确职责:清晰定义组件的角色,确保 Leaf 和 Composite 类的职责清晰。
  3. 避免不必要的复杂性:在简单场景下不必使用组合模式,保持设计的简洁性。

组合模式在处理树形结构时提供了一个强大而灵活的框架。通过将对象组合成部分-整体的结构,它简化了复杂对象的管理。尽管组合模式提供了许多优势,但使用时仍需考虑到潜在的复杂性。

在这篇文章中,我们从理论到实践全面探讨了组合模式在 C++ 中的实现,同时提供了一个简单的文件系统示例来展示其应用。如果您想在您的项目中实现类似的结构,组合模式将是一个非常合适的选择。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开放式耳机对耳朵的伤害大吗?四款平价好用的蓝牙耳机推荐

开放式耳机对耳朵伤害不大。因为其设计特点使得声音可以在一定程度上与外界环境相通&#xff0c;减少了对耳膜的直接压力和封闭环境带来的影响&#xff0c;相比封闭式耳机&#xff0c;更不容易导致耳部压力失衡和细菌滋生等问题。 以下是比较好的几款产品&#xff0c;可供借鉴&…

线上报名链接怎么做_零基础小白也能做

在这个日新月异的数字时代&#xff0c;每一次点击都可能是通往新世界的钥匙。今天&#xff0c;我们诚挚地向您发出邀请&#xff0c;通过这独一无二的线上报名链接&#xff0c;不仅简化繁琐的报名流程&#xff0c;更让您轻松跨越现实的界限&#xff0c;踏入一场精心策划的盛宴或…

CSS3 文本效果(text-shadow,box-shadow,white-space等)文本溢出隐藏并且显示省略号

一 text-shadow text-shadow 属性是 CSS3 中用于为文本添加阴影效果的工具。它可以增强文本的可读性和视觉吸引力&#xff0c;提供丰富的视觉效果 1 语法 text-shadow: offset-x offset-y blur-radius color;offset-x&#xff1a;阴影相对于文本的水平偏移量。可以是正值&am…

自建 git 服务器

所有老板&#xff08;至少 99%&#xff09;都一样&#xff0c;想花一分钱办两分钱的事&#xff0c;想招十块钱的人干二十块钱的事……我表示理解&#xff08;A Pei ~~ 既想马儿跑得快&#xff0c;又想马儿不吃草&#xff09; 在老板眼中&#xff0c;我恰好是那个性价比最高的人…

MFC工控项目实例之八选择下拉菜单添加打钩图标

承接专栏《MFC工控项目实例之七点击下拉菜单弹出对话框》 具体添加菜单栏参考我的博客文章《MFC工控项目实例之七点击下拉菜单弹出对话框》 这里只给出相关代码 1、在SEAL_PRESSUREDlg.h文件中添加代码 class CSEAL_PRESSUREDlg : public CDialog { // Construction public:..…

5年数据观巨变,这家公司如何在AI和大模型数据赛道遥遥领先?

过去5年&#xff0c;整个社会对于数据的观念和认知&#xff0c;发生了天翻地覆的改变。这要归功于OpenAI与预训练大语言模型&#xff08;以下简称大模型&#xff09;的问世以及横扫全球的ChatGPT。从2020年1月OpenAI发表《自然语言模型的“摩尔定律”&#xff08;Scaling Law f…

算法训练营——day1数组二分查找

数组是存放在连续空间上的相同数据类型的集合。 注意&#xff1a;下标从0开始&#xff1b;内存空间连续。 正因为数组的内存地址空间连续&#xff0c;所以在删除、添加元素的时候需要移动其他元素。 数组的元素不能删除&#xff0c;只能覆盖&#xff01; 二维数组特殊 在C中&…

测试使用开源异构迁移工具dbswitch

dbswitch: 异构数据库迁移同步(搬家)工具 (base) rootnode13:~# cat /etc/issue Ubuntu 20.04.5 LTS \n \l (base) rootnode13:~# curl -k -sSL https://gitee.com/dromara/dbswitch/attach_files/1878800/download > /tmp/dbswitch_install.sh && bash /tmp/dbsw…

佰朔资本:社融是什么?社融增加是利好还是利空

社融即全社会融资规划&#xff0c;是指实体经济从金融体系取得的资金。包括人民币信贷、债券发行、股票发行、非金融企业债券、政府债券等各种融资办法&#xff0c;也称为社会融资量。 社会融资规划存量是指一守时期末&#xff08;月末、季末或年底&#xff09;实体经济从金融…

9月新机首发:骁龙芯片+超大电池,游戏玩家的终极选择

随着秋风送爽的9月到来&#xff0c;智能手机和电子设备市场也迎来了新一轮的热潮。8月份的新机发布热潮刚刚退去&#xff0c;9月份的新机已经迫不及待地揭开了神秘的面纱。在众多备受期待的产品中&#xff0c;红魔品牌抢先官宣&#xff0c;两款全新的游戏平板将在9月5日正式亮相…

C++国密SM2算法加解密的使用

目录 效果 在线校验 代码实现参考 项目 下载 效果 加密字符串:lxw 123abcD 2024-09-01:12:00加密后信息:042E82EE8ACE2BD56FA71DC6A0C34190627AA365F8EEE6261903BEE327A85EB5E1D6E78F2D79AD6F6DC9E45C0829625DC3165BB78BD897F99044A640F930653747939CF9D5A10C8216F945A559…

【SQL】Delete使用

目录 语法 需求 示例 分析 代码 语法 DELETE删除表中所需内容 删除表中满足特点条件的行&#xff1a;DELETE FROM 表名 WHERE 条件; 删除表中所有行&#xff1a;DELETE FROM 表名; WHERE子句 WHERE子句用于指定从表中选取记录的条件。允许筛选数据&#xff0c;只返回满足…

filezilla使用教程(window下filezilla使用教程)

filezilla使用教程&#xff08;window下filezilla使用教程&#xff09; 一、安装与配置 首先&#xff0c;你需要从FileZilla的官方网站下载并安装适合你操作系统的版本。安装完成后&#xff0c;打开FileZilla&#xff0c;你将看到一个简洁的用户界面。 在FileZilla中&#x…

「SpEL Validator」使用指南(一套无敌的参数校验组件)

前言 这是一套全新的参数校验组件&#xff0c;并非造轮子。 看完本文你可能会觉得用不上或不屑于使用&#xff0c;但这玩意确实有应用场景&#xff0c;你不妨稍微留意一下&#xff0c;日后你总会发现有用得上的时候。 此乃系列文章&#xff0c;当前为第②篇&#xff0c;其他…

用Python实现时间序列模型实战——Day 8: 季节性ARIMA模型 (SARIMA)

一、学习内容 1. SARIMA 模型的定义与公式推导 SARIMA 模型&#xff1a; SARIMA 模型是扩展了 ARIMA 模型的一种方法&#xff0c;全称为季节性自回归积分滑动平均模型&#xff08;Seasonal AutoRegressive Integrated Moving Average&#xff09;。它结合了 ARIMA 模型的非季…

sed awk 第二版学习(二)—— 正则表达式语法

目录 一、表达式 二、成行的字符 1. 反斜杠 2. 通配符 3. 编写正则表达式 4. 字符类 &#xff08;1&#xff09;字符的范围 &#xff08;2&#xff09;排除字符类 &#xff08;3&#xff09;POSIX 字符类补充 5. 重复出现的字符 6. 匹配单词 7. gres 替换脚本 8. …

超越卷积滤波器,HyCoT利用Transformer捕捉高光谱图像的全局依赖性 !

近年来&#xff0c;基于学习的高光谱图像&#xff08;HSI&#xff09;压缩模型的开发引起了大量关注。现有的模型主要使用卷积滤波器&#xff0c;仅捕捉局部依赖性。 此外&#xff0c;它们通常会带来高昂的训练成本&#xff0c;并具有较大的计算复杂性。 为了解决这些问题&…

upload-labs通关攻略

Pass-1 这里上传php文件说不允许上传 然后咱们开启抓包将png文件改为php文件 放包回去成功上传 Pass-2 进来查看提示说对mime进行检查 抓包把这里改为image/jpg; 放包回去就上传成功了 Pass-3 这里上传php文件它说不允许上传这些后缀的文件 那咱们就可以改它的后缀名来绕过…

KinectFusion

1.KinectFusion 笔记来源&#xff1a; 论文地址&#xff1a;KinectFusion: Real-time 3D Reconstruction and Interaction Using a Moving Depth Camera* 项目地址&#xff1a;github/KinectFusion [1] 截断符号距离 | TSDF, Truncated Signed Distance Function 本篇对Kinec…

工业储能柜内部运行状态监测装置

工商业储能是用户侧储能的主要应用之一&#xff0c;其核心场景包括峰谷套利、需&#xff08;容&#xff09;量管理、应急备电、动态增容和需求侧响应。为了实现这些功能并确保储能系统的安全、可靠与经济运行&#xff0c;储能集成厂家必须关注多个方面&#xff0c;其中储能设备…