📜  C++中的复合设计模式(1)

📅  最后修改于: 2023-12-03 14:59:51.296000             🧑  作者: Mango

C++中的复合设计模式

介绍

复合设计模式(Composite Design Pattern)是一种结构性设计模式,它允许客户端统一地处理对象及对象组合。它将对象组合成树状结构,使得客户端可以像处理单个对象一样处理对象组合。这种模式属于组合模式。

UML

下面是复合设计模式的UML图:

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;
}
总结

复合设计模式的核心思想是将对象组合成树状结构,使得客户端可以像处理单个对象一样处理对象组合。我们可以通过这种模式来处理树状结构数据,例如文件系统,部门组织结构等。这种模式降低了系统的耦合性,并提高了代码的重用性和扩展性。