当前位置: 首页 > news >正文

C++ 设计模式:组合模式(Composite Pattern)

链接:C++ 设计模式
链接:C++ 设计模式 - 迭代器模式
链接:C++ 设计模式 - 职责链模式

组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

1.问题分析

在开发过程中,我们经常需要处理树形结构的数据,例如文件系统、组织结构、GUI组件等。在这些场景中,单个对象和组合对象的操作应该具有一致性,以简化客户端代码的处理。

组合模式通过定义一个统一的接口来表示单个对象和组合对象,使得客户端可以一致地处理它们。组合模式的核心在于将对象组合成树形结构,并通过递归的方式处理这些对象。

2.实现步骤

  1. 定义组件接口(Component):声明组合对象和叶子对象的共同操作。
  2. 实现叶子类(Leaf):实现组件接口,表示叶子对象。
  3. 实现组合类(Composite):实现组件接口,表示组合对象,并包含子对象的管理方法。

3.代码示例

以文件系统示例。

3.1.定义组件接口

// Component类,定义组合对象和叶子对象的共同接口
class FileSystemComponent {public:virtual ~FileSystemComponent() = default;virtual void display(int indent = 0) const = 0;
};

3.2.实现叶子类

// Leaf类,表示文件
class File : public FileSystemComponent {public:File(const std::string& name) : name_(name) {}void display(int indent = 0) const override { std::cout << std::string(indent, ' ') << name_ << std::endl; }private:std::string name_;
};

3.3.实现组合类

// Composite类,表示目录
class Directory : public FileSystemComponent {public:Directory(const std::string& name) : name_(name) {}void add(FileSystemComponent* component) { components_.push_back(component); }void display(int indent = 0) const override {std::cout << std::string(indent, ' ') << name_ << "/" << std::endl;for (const auto& component : components_) {component->display(indent + 2);}}private:std::string name_;std::vector<FileSystemComponent*> components_;
};

3.4.客户端代码

int main() {Directory root("root");File file1("file1.txt");File file2("file2.txt");Directory subDir1("subdir1");File file3("file3.txt");subDir1.add(&file3);root.add(&file1);root.add(&file2);root.add(&subDir1);root.display();return 0;
}
http://www.lryc.cn/news/513223.html

相关文章:

  • OpenHarmony源码编译后烧录镜像教程,RK3566鸿蒙开发板演示
  • 强化学习(1)
  • 【漏洞复现】金和OA C6 FileDownLoad.aspx 任意文件读取漏洞复现
  • 开源模型应用落地-qwen2-7b-instruct-LoRA微调-Axolotl-单机多卡-RTX 4090双卡(七)
  • Dockerfile 构建继承父镜像的 ENTRYPOINT 和 CMD
  • 46. Three.js案例-创建颜色不断变化的立方体模型
  • Linux系统离线部署MySQL详细教程(带每步骤图文教程)
  • 【数据仓库】hive on Tez配置
  • Kubernetes Gateway API-3-TLS配置
  • C++ 设计模式:原型模式(Prototype Pattern)
  • 计算机网络 (12)物理层下面的传输媒体
  • SpringCloud 系列教程:微服务的未来(三)IService接口的业务实现
  • 测试带宽上行方法
  • 天天跳绳(???)
  • module ‘django.db.models‘ has no attribute ‘FieldDoesNotExist‘
  • 智能工厂的设计软件 应用场景的一个例子:为AI聊天工具添加一个知识系统 之10 方案再探之1:特定于领域的模板 之1 随想交流
  • Excel将混乱的多行做成1列
  • Django项目部署到服务器
  • SpringBoot集成Flowable
  • 大模型从零开始——预训练之分词 Tokenization
  • Python下载包缓慢时怎么修改镜像源
  • 每日一练 | 时延和抖动
  • 嵌入式开发之使用 FileZilla 在 Windows 和 Ubuntu 之间传文件
  • 腾势D9风光不再?中期改款能否及时“救火”
  • OpenCV-Python实战(11)——边缘检测
  • 【智行安全】基于Synaptics SL1680的AI疲劳驾驶检测方案
  • 机器学习随机森林回归时间序列预模型中时间滑动窗口作用以及参数设置
  • 【Rust自学】7.5. use关键字 Pt.2 :重导入与换国内镜像源教程
  • 自定义luacheck校验规则
  • python钉钉机器人