组合模式(Composite)

组合模式是一种结构型设计模式,用于将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式允许客户端以统一的方式对待单个对象和对象的集合,使得可以通过相同的接口来操作对象和它们的组合。

1. 组合模式的结构

组合模式包含以下几个主要组件:

  • Component(组件): 定义了叶子对象和组合对象的公共接口,声明了叶子和组合的公共方法。
  • Leaf(叶子): 实现了 Component 接口,并且代表树叶节点。叶子对象是不能有子节点的。
  • Composite(组合): 实现了 Component 接口,并且能够有子节点(叶子或其他组合对象)。组合对象负责管理子节点,并实现对这些子节点的操作。

2. Mermaid 关系图

以下是组合模式的类图,用 Mermaid 表示:

classDiagram
    class Component {
        + operation() : void
    }

    class Leaf {
        + operation() : void
    }

    class Composite {
        + add(c : Component) : void
        + remove(c : Component) : void
        + operation() : void
    }

    Component <|-- Leaf
    Component <|-- Composite
    Composite --> Component : "包含"

3. 组合模式的实现

Component 组件接口:

class Component {
public:
    virtual ~Component() = default;
    virtual void operation() const = 0;
};

Leaf 叶子类:

class Leaf : public Component {
public:
    void operation() const override {
        std::cout << "Leaf operation\n";
    }
};

Composite 组合类:

#include <vector>
#include <memory>

class Composite : public Component {
private:
    std::vector<std::shared_ptr<Component>> children;

public:
    void add(std::shared_ptr<Component> component) {
        children.push_back(component);
    }

    void remove(std::shared_ptr<Component> component) {
        children.erase(std::remove(children.begin(), children.end(), component), children.end());
    }

    void operation() const override {
        std::cout << "Composite operation\n";
        for (const auto& child : children) {
            child->operation();
        }
    }
};

Client 客户端代码:

int main() {
    std::shared_ptr<Component> leaf1 = std::make_shared<Leaf>();
    std::shared_ptr<Component> leaf2 = std::make_shared<Leaf>();

    Composite composite;
    composite.add(leaf1);
    composite.add(leaf2);

    composite.operation();

    return 0;
}

4. 使用组合模式

在客户端代码中,可以将叶子对象和组合对象通过相同的接口进行操作。组合模式允许客户端以统一的方式处理复杂的树形结构,而无需区分单个对象和组合对象。

5. 总结

组合模式通过将对象组合成树形结构来表示部分-整体的层次结构,使得客户端能够以一致的方式对待单个对象和对象集合。Mermaid 类图展示了组件接口、叶子类、组合类以及它们之间的关系,帮助理解模式的结构和实现。