大话设计模式之组合模式

组合模式是一种结构型设计模式,它允许你将对象组合成树形结构以表现"整体-部分"的层次结构。组合模式使得用户对单个对象和组合对象的处理具有一致性。

在组合模式中,有两种类型的对象:

  1. 叶节点(Leaf): 叶节点是树结构中的最终节点,它没有子节点。它通常执行最终操作。

  2. 组合节点(Composite): 组合节点是包含子节点的节点,它可以包含叶节点或其他组合节点。组合节点通常将请求委派给其子节点,并对结果进行汇总。

#include <iostream>
#include <vector>

// 抽象组件类
class Component {
public:
    virtual ~Component() {}
    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) {
        children_.push_back(component);
    }

    void remove(Component* component) {
        // 移除 component
        children_.erase(std::remove(children_.begin(), children_.end(), component), children_.end());
    }

    void operation() const override {
        std::cout << "Composite operation" << std::endl;
        // 调用所有子节点的操作
        for (const auto& child : children_) {
            child->operation();
        }
    }

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

int main() {
    Leaf leaf1, leaf2;
    Composite composite1, composite2;

    composite1.add(&leaf1);
    composite1.add(&leaf2);

    composite2.add(&composite1);

    leaf1.operation();
    std::cout << std::endl;

    composite1.operation();
    std::cout << std::endl;

    composite2.operation();

    return 0;
}

/*
在这个示例中,Component 是抽象组件类,它声明了所有组件的通用操作。Leaf 类是叶节点,
它实现了具体的操作。Composite 类是组合节点,它可以包含叶节点或其他组合节点,
并实现了操作以处理其子节点。

在 main() 函数中,我们创建了几个叶节点和组合节点,并将它们组合成树形结构。
然后我们分别调用了叶节点和组合节点的操作,验证了组合模式的正确性。
*/

相关推荐

  1. 大话设计模式组合模式

    2024-04-04 06:08:05       12 阅读
  2. 设计模式组合模式

    2024-04-04 06:08:05       10 阅读
  3. 大话设计模式工厂模式

    2024-04-04 06:08:05       19 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-04 06:08:05       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-04 06:08:05       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-04 06:08:05       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-04 06:08:05       20 阅读

热门阅读

  1. 我的创作纪念日

    2024-04-04 06:08:05       17 阅读
  2. acrn guest 内存分析

    2024-04-04 06:08:05       11 阅读
  3. DockerFile启动jar程序

    2024-04-04 06:08:05       12 阅读
  4. Sass学习记录

    2024-04-04 06:08:05       14 阅读
  5. NRM详解

    2024-04-04 06:08:05       18 阅读
  6. SpringBoot如何集成nacos,用于服务发现和配置管理

    2024-04-04 06:08:05       13 阅读
  7. 【Next.js】连接 MongoDB 实现基本的接口

    2024-04-04 06:08:05       15 阅读
  8. MongoDB聚合运算符:$lte

    2024-04-04 06:08:05       14 阅读
  9. 金融出海机遇与挑战

    2024-04-04 06:08:05       14 阅读
  10. Linux初学(十二)AWK进阶

    2024-04-04 06:08:05       14 阅读
  11. WebGL BabylonJs 如何切换相机

    2024-04-04 06:08:05       15 阅读