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

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.kler.cn/a/464780.html

相关文章:

  • 前端小案例——520表白信封
  • 使用 `llama_index` 构建智能问答系统:多种文档切片方法的评估
  • ceph集群配置
  • Go语言的数据类型
  • 基于32单片机的智能语音家居
  • 苍穹外卖 项目记录 day03
  • QT----------多媒体
  • HarmonyOS Next ArkUI @State @Prop @Link @Provide @Consume笔记
  • EasyExcel简介和读写操作
  • IoC设计模式详解:控制反转的核心思想
  • PyTorch 中 coalesce() 函数详解与应用示例
  • Linux之ARM(MX6U)裸机篇----6.BSP工程管理实验
  • Vue 自定义指令
  • 全国知名网络安全赛事西湖论剑·杭州网络安全技能大赛启动报名
  • 【C++/CMake】从静态库到动态库:一行改动解决 “找不到 -ljsoncpp” 链接报错
  • 第二十六天 自然语言处理(NLP)词嵌入(Word2Vec、GloVe)
  • TTL 传输中过期问题定位
  • 【网络协议】路由信息协议 (RIP)
  • 【PyTorch][chapter 28][李宏毅深度学习][Diffusion Model-2]
  • C# 设计模式(结构型模式):装饰器模式
  • 【51单片机-零基础chapter1】
  • MySQL/Oracle集群
  • 操作系统论文导读(八):Schedulability analysis of sporadic tasks with multiple criticality specifications——具有多个
  • 8086汇编(16位汇编)学习笔记10.寄存器总结
  • 数据的高级处理——pandas模块进阶——使用Python进行数据分析
  • 六十二:HTTP/3: QUIC 协议格式