首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >组合模式解决什么问题_组合模式实例

组合模式解决什么问题_组合模式实例

作者头像
全栈程序员站长
发布2022-09-22 14:28:26
发布2022-09-22 14:28:26
4420
举报

大家好,又见面了,我是你们的朋友全栈君。

组合模式 Composite

动机

在软件某些情况下,客户代码过多地依赖于对象容器复杂的内部实现结构,对象内部实现结构(而非抽象接口)地变化将引起客户代码地频繁变化.带来代码地维护性,扩展性等弊端

如何将”客户代码与复杂地对象容器结构”解耦?让对象容器自己来实现自身地复杂结构,从而使得客户代码就像处理简单对象一样来处理复杂地对象容器

模式定义

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

实例

树形访问

代码语言:javascript
复制
#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 *element){ 
   
        elements.push_back(element);
    }
    void remove(Component* element){ 
   
        elements.remove(element);
    }
    void process(){ 
   
        //process current node

        //process current nodes
        for (auto &e : elements){ 
   
            e->process();
        }
    }
}
class leaf : public Component{ 
   
    string name;
public:
    Leaf(string s) : name(s){ 
   }
    void process(){ 
   
        //process current node
    }
}

void Invoke(Component &c){ 
   
    //...
    c.process();
    //...
}

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

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

    root.add(&treeNode3);   //具有一致性
    treeNode3.add(&treeNode4);//具有一致性
    treeNode4.add(&left2);//具有一致性

    process(root);
}

int main(){ 
   

    return 0;
}

结构

要点总结

  • Composite 模式采用树形结构来实现普遍存在地对象容器,从而将”一对多”地关系转化为”一对一”地关系,使得客户代码可以一致地(复用)处理对象和对象容器,无需关心处理地是单个地对象.还是组合地对象容器.
  • 将”客户代码与复杂地对象容器结构”解耦是Composite地核心思想,解耦之后.客户代码将与纯粹地抽象接口–而非对象容器地内容实现结构—发生依赖,从而更能”应对变化”
  • Compoiste模式在具体实现中,可以让父对象中地子对象反向追溯 如果父对象有频繁地遍历需求,可使用缓存技巧来改善效率

笔记

  • 一致性指的是对待整体和对待单个 是一样地
  • 访问地时候把树形结构地访问封装在了内部 而不是暴漏在外部
  • add 和 remove函数地放置位置有争议

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/168500.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 组合模式 Composite
  • 动机
  • 模式定义
  • 实例
  • 结构
  • 要点总结
  • 笔记
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档