链接:C++ 设计模式
链接:C++ 设计模式 - 迭代器模式
链接:C++ 设计模式 - 职责链模式
组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
1.问题分析
在开发过程中,我们经常需要处理树形结构的数据,例如文件系统、组织结构、GUI组件等。在这些场景中,单个对象和组合对象的操作应该具有一致性,以简化客户端代码的处理。
组合模式通过定义一个统一的接口来表示单个对象和组合对象,使得客户端可以一致地处理它们。组合模式的核心在于将对象组合成树形结构,并通过递归的方式处理这些对象。
2.实现步骤
- 定义组件接口(Component):声明组合对象和叶子对象的共同操作。
- 实现叶子类(Leaf):实现组件接口,表示叶子对象。
- 实现组合类(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;
}