组合模式 Composite[通俗易懂]

组合模式 Composite[通俗易懂]组合模式 Composite动机模式定义实例结构要点总结笔记动机在软件某些情况下,客户代码过多地依赖于对象容器复杂的内部实现结构,对象内部实现结构(而非抽象接口)地变化将引起客户代码地频繁变化.带来代码地维护性,扩展性等弊端如何将”客户代码与复杂地对象容器结构”解耦?让对象容器自己来实现自身地复杂结构,从而使得客户代码就像处理简单对象一样来处理复杂地对象容器模式定义将对象组合成树形结构以表示”整体-部分”地层次结构.Composite使得用户对单个对象和组合对象地使用具有一致性(稳定)实例树形

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

动机

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

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

模式定义

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

实例

树形访问

#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.net/169032.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • tomcat出现乱码怎么办_tomcat输出日志乱码

    tomcat出现乱码怎么办_tomcat输出日志乱码1.打开tomcat如下位置:找到logging-properties文件,选择用代码编辑器打开(我这里选择用idea)2.在25-47行中把五个红框起来的UTF-8改为GB2312此时点击bin,目录下的startup.bat(window用户)或startup.sh(mac用户)启动tomcat,控制台的乱码问题解决。如果此时还没有解决乱码问题,需要1.windows+R打开运行,在运行框中输入regedit,进入注册表编辑器中2.如果没有Tomcat或者CodePag(1)

    2022年9月25日
  • jsonobject string转json_java jsonobject转string

    jsonobject string转json_java jsonobject转string你需要把字符串利用一些字符串函数得到=》{“name”:”小明”,”pwd”:”123″}再转就可以了。比如:entity({“name”:”小明”,”pwd”:”123″})这种就转化不了,会报错。这里的String是有些要求的,首先它要是json格式,其次json格式中不能出现其他的字符。这里的JSONObject对像是不是hutool这些工具类的哦,是java内部自带这个。代码是我手敲的可能会出错。很简单JSONObject有toSting方法直值调用就好。…

    2022年8月23日
  • POJ2375 Cow Ski Area 【强连通分量】+【DFS】

    POJ2375 Cow Ski Area 【强连通分量】+【DFS】CowSkiAreaTimeLimit: 1000MS MemoryLimit: 65536KTotalSubmissions: 2323 Accepted: 660DescriptionFarmerJohn’scousin,FarmerRon,wholivesinthemountainsof

    2022年5月11日
  • 舍去法取整php,floor舍去法取整「建议收藏」

    舍去法取整php,floor舍去法取整「建议收藏」初识App安全性测试目前手机App测试还是以发现bug为主,主要测试流程就是服务器接口测试,客户端功能性覆盖,以及自动化配合的性能,适配,压测等,对于App安全性测试貌似没有系统全面统一的标准和流程,其实安全性bug也可…【ASP&period;NETIdentity系列教程(三)】Identity高级技术注:本文是[ASP.NETIdentity系列教程]的第三篇.本系列教程详…

    2022年6月21日
  • Java遍历数组逗号的使用[通俗易懂]

    Java遍历数组逗号的使用[通俗易懂]1.错误示例当直接拼接”,”号会在结尾也输出多余的”,”号输出示例2正确示例用判断语句来写当x等于(arr.length的长度-1)满足时,也就是数组arr[4],会在arr[4]后面输出一个”]”号,//(至于为什么不是在arr[4]前面输出”]”,参考java基本结构:顺序结构)当这个条件不满足才会输出”,”号输出示例我是java自学小萌新【闲云】…

    2022年9月19日
  • AWS S3 学习小结

    AWS S3 学习小结1.首先,这个是AWS的开发资源使用文档:AWS开发文档,AWS官网-S3教程​​​​​​​2.我们可以通过AWSCli和JavaApi来操作AWS的S3,AWSCli安装教程:AWSCli安装3.Linux下连接S3前,需要先获取到AWS的IAM的accessKey和secretKey,那么获取方式是:服务->安全、身份与合规分组下的IAM->用户…

    2022年10月19日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号