自学内容网 自学内容网

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

链接: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;
}

原文地址:https://blog.csdn.net/sinat_27236401/article/details/144484470

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!