📅  最后修改于: 2023-12-03 14:59:51.296000             🧑  作者: Mango
复合设计模式(Composite Design Pattern)是一种结构性设计模式,它允许客户端统一地处理对象及对象组合。它将对象组合成树状结构,使得客户端可以像处理单个对象一样处理对象组合。这种模式属于组合模式。
下面是复合设计模式的UML图:
Component
是定义对象和对象组合的接口,在树结构中扮演抽象节点的角色。Leaf
是定义叶子节点对象的行为。Composite
是定义容器节点对象的行为,其中包括添加、删除子节点等。下面是复合设计模式的实现代码示例,以一个文件系统为例:
#include <iostream>
#include <memory>
#include <vector>
class FileSystemComponent {
public:
virtual ~FileSystemComponent() = default;
virtual void showInfo() const = 0;
virtual void add(std::unique_ptr<FileSystemComponent>) {}
virtual void remove(FileSystemComponent &) {}
};
class File final : public FileSystemComponent {
std::string name_;
public:
explicit File(std::string name) : name_(std::move(name)) {}
void showHierarchy(const std::size_t &) const override {
std::cout << std::string(depth, '-') << "[File] " << name_ << '\n';
}
};
class Folder final : public FileSystemComponent {
std::string name_;
std::vector<std::unique_ptr<FileSystemComponent>> components_;
public:
explicit Folder(std::string name) : name_(std::move(name)) {}
void showHierarchy(const std::size_t &depth) const override {
std::cout << std::string(depth, '-') << "[Folder] " << name_ << '\n';
for (const auto &component : components_) {
component->showHierarchy(depth + 1);
}
}
void add(std::unique_ptr<FileSystemComponent> component) override {
components_.push_back(std::move(component));
}
void remove(FileSystemComponent &component) override {
auto iter = std::find_if(std::begin(components_), std::end(components_),
[&](const std::unique_ptr<FileSystemComponent> &c) { return c.get() == &component; });
if (iter != components_.end()) components_.erase(iter);
}
};
int main() {
std::unique_ptr<Folder> root = std::make_unique<Folder>("C:");
std::unique_ptr<Folder> folder1 = std::make_unique<Folder>("Program Files");
std::unique_ptr<Folder> folder2 = std::make_unique<Folder>("Users");
std::unique_ptr<File> file1 = std::make_unique<File>("readme.txt");
std::unique_ptr<File> file2 = std::make_unique<File>("main.cpp");
root->add(std::move(folder1));
root->add(std::move(folder2));
folder1->add(std::move(file2));
folder2->add(std::move(file1));
root->showHierarchy(0);
std::cout << "============================================\n";
folder2->remove(*file1);
root->showHierarchy(0);
return 0;
}
复合设计模式的核心思想是将对象组合成树状结构,使得客户端可以像处理单个对象一样处理对象组合。我们可以通过这种模式来处理树状结构数据,例如文件系统,部门组织结构等。这种模式降低了系统的耦合性,并提高了代码的重用性和扩展性。