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


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

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

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

    组合模式的主要优点是:

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

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

    #include 
    #include 
    
    // 抽象组件
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65

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

  • 相关阅读:
    Opensips安装配置(以下操作均已centOS 6.3系统为准)
    加盟咖啡店如何盈利?七大面解析店铺咋赚钱
    RoadBEV:鸟瞰图中的道路表面重建
    Stable Diffusion——Animate Diff一键AI图像转视频
    李阳:京东零售OLAP平台建设和场景实践
    浏览器解析URL全部流程
    Java中的static
    (三)操作系统的运行环境
    java计算机毕业设计ssm兴趣班和延时班管理系统(源码+系统+mysql数据库+Lw文档)
    python-web开发[20]之开发小结
  • 原文地址:https://blog.csdn.net/lanyang123456/article/details/136222291