设计模式-组合模式

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

软件在某些情况下客户代码过多依赖对象容器复杂的内部实现结构,对象容器内部实现结构的变化将引起客户代码的频繁变化。需要将客户代码和复杂的对象容器结构解耦,让对象容器自己来实现自身复杂的结构。


提示:以下是本篇文章正文内容,下面案例可供参考

一、模式定义

将对象组合成树形结构以表示部分-整体的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性(稳定)。

二、代码实例

cpp 复制代码
#include <algorithm>

using namespace std;

class Component
{
    public:
    virtual void process() = 0;
    virtual ~Component() {}
};

// 树节点
class Composite: public Component
{
    string name;
    list<Component*> elements;

    public:
        Composite(const string& s): name(s) {}

        void add(Component* c) { elements.push_back(c); }
        void remove(Component* c) { elements.remove(c); }
        void process()
        {
            // process current node

            // process leaf nodes
            for(auto& e: elements)
            {
                e->process();
            }
        }
}

// 叶子节点
class Leaf: public Component
{
    string name;

    public:
        Leaf(const string& s): name(s) {}

        void process() { /* ... */ }
}

// 客户程序
void Invoke(Component* c)
{
    /*前处理*/
    c->process();

    /*后处理*/
}

int main()
{
    Composite root("root");
    Composite treeNode1("treeNode1");
    Composite treeNode2("treeNode2");
    Component treeNode3("treeNode3");
    Component treeNode4("treeNode4");
    Leaf leaf1("leaf1");
    Leaf leaf2("leaf2");

    root.add(&treeNode1);
    treeNode1.add(&treeNode2);
    treeNode2.add(&leaf1);

    root.add(&treeNode3);
    treeNode3.add(&treeNode4);
    treeNode4.add(&leaf2);

    root.process();
}

三、类图

相关推荐
杨充8 小时前
10.可测试性实战设计
设计模式·开源·代码规范
杨充8 小时前
9.重构十二式的实战
设计模式·开源·代码规范
杨充9 小时前
6.设计原则的全景图
设计模式·开源·全栈
杨充9 小时前
2.面向对象的特性
设计模式
杨充9 小时前
7.SOLID原则案例汇
设计模式·开源·全栈
杨充9 小时前
8.反模式与坏味道
设计模式·开源·代码规范
杨充9 小时前
3.接口vs抽象类比较
设计模式
咖啡八杯12 小时前
文法、BNF与AST
java·设计模式·解释器模式·ast·文法
咖啡八杯20 小时前
GoF设计模式——解释器模式
java·后端·spring·设计模式