设计模式--组合模式(Composite Pattern)

组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构,并且能像使用独立对象一样使用它们。

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

  1. Component:这是组合中对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理Component的子部件。
  2. Leaf:在组合中表示叶节点对象,叶节点没有子节点。
  3. Composite:定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关操作,如增加(add)和删除(remove)等。

组合模式的主要优点是:

  • 高层模块调用简单:客户端可以一致地使用组合结构和单个对象,简化了客户端与这些对象的交互,让客户端更简单地操作这些对象。
  • 节点自由增加:使用组合模式,我们可以动态地添加、删除和修改对象,也就是说,客户端不必因为业务逻辑的改变而改变。
    组合模式适用于以下场景:
  • 想表示对象的部分-整体层次结构。
  • 希望用户忽略组合对象和单个对象的不同,用户将统一地使用组合结构中的所有对象。

以下是一个简单的C++实现的组合模式(Composite Pattern)示例:

c 复制代码
#include <iostream>
#include <vector>

// 抽象组件
class Component {
public:
    virtual void operation() = 0;
    virtual void add(Component* c) {}
    virtual void remove(Component* c) {}
    virtual ~Component() {}
};

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

// 复合组件
class Composite : public Component {
public:
    void operation() override {
        std::cout << "Composite operation..." << std::endl;
        for (Component* c : children) {
            c->operation();
        }
    }

    void add(Component* c) override {
        children.push_back(c);
    }

    void remove(Component* c) override {
        children.erase(std::remove(children.begin(), children.end(), c), children.end());
    }

    ~Composite() {
        for (Component* c : children) {
            delete c;
        }
        children.clear();
    }

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

int main() {
    Composite* composite = new Composite();
    composite->add(new Leaf());
    composite->add(new Leaf());

    Composite* composite2 = new Composite();
    composite2->add(new Leaf());
    composite2->add(new Leaf());

    composite->add(composite2);
    composite->operation();

    delete composite;

    return 0;
}

在这个例子中,Component是抽象组件,定义了operation、add和remove等接口。Leaf是叶子组件,实现了operation接口。Composite是复合组件,除了实现operation接口,还实现了add和remove接口,用于添加和删除子组件。在operation接口中,Composite会调用所有子组件的operation接口。

相关推荐
剧中有戏15 小时前
抽象工厂模式从入门到精通:一个多云存储案例的完整剖析(修订版)
设计模式
MC皮蛋侠客19 小时前
Redis 系列(八):缓存设计模式与一致性——从 Cache Aside 到防雪崩
redis·缓存·设计模式
莫得感情 o21 小时前
设计模式 18 · 状态模式
设计模式·状态模式
莫得感情 o21 小时前
设计模式 17 · 责任链模式
设计模式·责任链模式
用户938515635071 天前
从零在浏览器里跑 DeepSeek-R1:WebGPU + Transformer.js 全链路实战
前端·设计模式·typescript
AI人工智能+电脑小能手1 天前
大白话说Java设计模式-04-工厂方法模式(业务实战篇)
java·设计模式·工厂方法模式·架构设计·代码解耦
今天的砖头有点烫手啊2 天前
AI Agent 开发实战(十):Agent 设计模式(ReAct / Plan-Execute / Reflection)
人工智能·react.js·设计模式
董员外2 天前
RAG 系统进化论(十):可运营 RAG,从原型到长期运行的知识系统
人工智能·后端·设计模式
莫得感情 o2 天前
设计模式 15 · 模板方法模式
设计模式·模板方法模式