组合模式 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)
上一篇 2022年8月11日 下午8:46
下一篇 2022年8月11日 下午9:00


相关推荐

  • Java链表——遍历、查找、求链表长度

    Java链表——遍历、查找、求链表长度1.遍历非常简单的一段代码,只需要在节点不为空时,一个接一个地输出即可。publicvoidErgodic(){ ListNodeindexNode=head; while(indexNode.getNext()!=null){ System.out.print(indexNode.getVal()+””); indexNode=indexNode.getNext(); } }2.查找我们来做一个对值的查找…

    2022年5月13日
    65
  • jeecg主从数据库读写分离配置「建议收藏」

    1、修改Dbconfig.properties数据库配置文件:注意:从库属性的名字要与主库的属性名字区分开,属性名将会在后面的配置文件中用到。#数据库配置主库-写入库#MySQLhibernate.dialect=org.hibernate.dialect.MySQLDialectvalidationQuery.sqlserver=SELECT1jdbc.url=jdbc\:mys…

    2022年4月16日
    42
  • 自动化测试框架[Cypress PO模式]

    自动化测试框架[Cypress PO模式]【附源码】在Cypress中并不认为PO是个很好的模式,Cypress认为跨页面共享逻辑是一个反模式(Anti-Pattern),在Cypress中,它提供了很多方式,允许用户通过更简单的方式直接设置被测应用程序达到的待测试状态,不需要再不同页面一遍又一遍的执行相通操作

    2022年6月1日
    40
  • Java基础知识点总结归纳,超级全面!(2021版)

    Java基础知识点总结归纳,超级全面!(2021版)凯哥今天看了网上好多关于 Java 基础知识点汇总的博客 but 感觉都不尽如人意 要么不全面 要么不准确 要么排版太乱了 所以今天花了一天时间整理了一份 Java 基础知识点总结归纳 超级全面 希望对大家有帮助哈 由于本文篇幅过长 博主为了方便大家阅读和收藏 特意将本文转成了一份 PDF 版的文档 需要 PDF 版的朋友可以关注微信公众号 Java 团长 发送 基础知识 即可获取哈 一 Java 概述 1 何为编程编程就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码 并最终得到结果的过程

    2026年3月17日
    2
  • 新版卡盟官网源码_汇想卡盟官网

    新版卡盟官网源码_汇想卡盟官网最近,很多小伙伴们都在想搭建一个卡盟的主站,但是鉴于很多人都不太懂编程,也不知道如何找到源码。所以现在小编就为大家带来搭建卡盟主站教程,而且还把源码也一起送来了,想要搭建卡盟主站的话就记得一定要下载哦!搭建卡盟主站教程介绍1,完整无误经过校验的卡盟平台源码2,基于Ecshop内核的卡盟平台,游戏点卡销售的首选平台PHP+MYSQL3,前台模板已做深层SEO优化便于搜索引擎收录寻找卡盟源码1网…

    2022年8月13日
    11
  • 2分钟规则

    怕什么真理无穷,进一步有近一步的欢喜每日语录:当你纠结要不要做一件事的时候,那就去做~开头聊几句1、又是一段时间没有输出内容了,有时候有点时间,自己懒不想动2、工作和生活,工作为了生活,…

    2022年3月1日
    44

发表回复

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

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