首页 > 编程语言 >突破编程 C++ 设计模式(组合模式)详尽攻略

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

时间:2024-08-28 18:27:13浏览次数:9  
标签:std 组合 C++ add 文件夹 模式 攻略 设计模式 display

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

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

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++ 中的实现,同时提供了一个简单的文件系统示例来展示其应用。如果您想在您的项目中实现类似的结构,组合模式将是一个非常合适的选择。

标签:std,组合,C++,add,文件夹,模式,攻略,设计模式,display
From: https://blog.csdn.net/vvvae1234/article/details/141625264

相关文章

  • C++基础/C++中的多态(关于虚...)
    C++中的多态(关于虚...)1.前置基础知识1.1对象是如何存储在内存中的#include<iostream>#include<string>classAnimal{private:stringname;intage;public:Animal(std::stringname,intage):name(name),age(age){};~Animal();virtu......
  • C++基础/C++中的多态(关于虚...)
    C++中的多态(关于虚…)1.前置基础知识1.1对象是如何存储在内存中的#include<iostream>#include<string>classAnimal{private:stringname;intage;public:Animal(std::stringname,intage):name(name),age(age){};~Animal();......
  • SEM论文攻略
    1.名词解释Variables(变数)-统计分析的基本要素,分成潜在变数舆观察变数两种-研究目的在于了解变数之间的关係Observed(measured,indicatorormanifest)variables(观察变数):-可以直接观察或测量的变数,如血压、销货量价格、所得等。Latent(unobservedvariables,fa......
  • C++基础
    指针#include<iostream>usingnamespacestd;intmain(){//实际变量的声明intvar=20;//指针变量的声明int*addr;//在指针变量中存储var的地址addr=&var;cout<<"var="<<var<<endl;//输出在指针变量中存......
  • 你可能想知道如何下载DEV C++
    DevC++是一款适用于Windows平台的C/C++集成开发环境(IDE),它由Bloodshed公司开发,但自2011年后由独立开发者Orwelldevcpp继续更新维护。它支持C和C++编程语言,提供了编写、编译、调试和执行程序所需的基本功能。以下是下载DEVC++的步骤:官方下载渠道官方网站:访问SourceForgehttps......
  • C/C++实现JSON格式数据解析
    参考文章推荐以下几篇,针对Cjson的应用写的很详细,感谢!!!https://blog.csdn.net/xiaopengX6/article/details/104629606https://liang.blog.csdn.net/article/details/86605234运用场景在做C的项目时,对方通过TCP套接字将内容按照帧头+帧体的格式发送过来,其中帧体的内容是JSON格式......
  • 高斯坐标转WGS84 GPS坐标 C#版本 python版本和C++版本 3度带进行投影 三个版本的代码
    找了很久,都没有很靠谱的版本,这个是自己从C#版本转换的另外两个版本完整代码可以用经过了对比核对计算,确保3个版本之间的计算结果是一致的C#版本:GPSPointGSXYToGPS(doubleX,doubleY,doubleL0){//X=571879.3482847388;//Y=2770741.66......
  • Java 入门指南:Java IO 设计模式
    Java设计模式是一组被广泛应用于Java程序设计中的解决常见问题的可复用设计方案。这些设计模式通过提供一套经过验证的面向对象的设计原则和思想,可以帮助开发人员更好地组织和设计他们的代码。在JavaIO中,并没有像创建型、结构型和行为型等常见的设计模式那样有明确的命......
  • C++学习随笔——lock_guard和mutex的使用方法
    std::mutex和std::lock_guard是C++标准库中用于多线程同步的工具,主要用于防止多个线程同时访问共享资源,导致数据竞争问题。 std::mutex是一个用于互斥锁的类,提供了锁定(lock)和解锁(unlock)的功能。使用方法:#include<iostream>#include<thread>#include<mutex>std::......
  • C++中常用宏
    C++中会常使用到宏来进行条件编译,或设置变量1、__cplusplus:区分当前代码为C++或C//定义只在C++中才进行extern"C"的操作#ifdef__cplusplusextern"C"{#endifvoidfun(inta,intb);#ifdef__cplusplus}#endif2、区分操作系统:_WIN32:Windows操作系统,不区......