组合模式

组合模式(Composite Pattern)是一种结构型设计模式,其将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式使得客户端可以统一对待单个对象和组合对象,从而支持对整个树形结构进行统一的处理。

角色

  1. 组件(Component): 定义组合中所有对象的通用接口,声明了用于管理子组件的方法。
  2. 叶子节点(Leaf): 是组合中的叶子对象,它没有子组件,实现了组件的通用接口。
  3. 复合节点(Composite): 是组合中的复合对象,它可以包含叶子节点和其他复合节点,实现了组件的通用接口,并提供了管理子组件的方法。

客户端通过统一的接口操作组合对象,不需要区分叶子节点和复合节点。这种统一的接口使得客户端可以递归地处理整个树形结构,而无需关心具体是叶子节点还是复合节点。

场景

应用模型能够表示成树形结构

类图

2024-01-19T13:08:52.png

代码

#include <iostream>
#include <vector>

// 组件接口
class Component {
public:
    virtual void operation() const = 0;
};

// 叶子节点
class Leaf : public Component {
public:
    void operation() const override {
        std::cout << "Leaf operation." << std::endl;
    }
};

// 复合节点
class Composite : public Component {
public:
    void add(Component* component) {
        components.push_back(component);
    }

    void operation() const override {
        std::cout << "Composite operation." << std::endl;
        for (const auto& component : components) {
            component->operation();
        }
    }

private:
    std::vector<Component*> components;
};

int main() {
    // 创建组合对象
    Composite composite;

    // 添加叶子节点和复合节点到组合对象
    Leaf leaf1, leaf2;
    Composite subComposite;
    subComposite.add(&leaf1);
    subComposite.add(&leaf2);
    composite.add(&subComposite);

    // 调用操作
    composite.operation();

    return 0;
}