设计模式之~组合模式

news2024/12/23 22:45:33

组合模式:

        将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

结构图:

实例:

透明方式: 

        leaf中也有add和remove叫做透明方式,在component中声明所有用来管理子对象的方法,其中包括add、remove等。这样实现component接口的所有子类都具备了add和remove。这样的好处是叶节点和枝节点对外界没有区别,他们具备完全一致的行为接口。

        但问题也很明显,因为leaf类本身不具备add和remove等功能,所以实现他是没有意义的。

透明模式的特点:

        就是将组合对象所有的公共方法都定义在了抽象组件内,

优点:是客户端无需分辨当前对象是属于树枝节点还是叶子节点,因为它们具备了完全一致的接口,

缺点:叶子节点得到到了一些不属于它的方法.。树叶是不存在子类的,因此Component声明的一些方法对于树叶来说是不适用的。这样也就带来了一些安全性问题。

安全方式:

        在Component接口中不去声明Add和Remove方法,那么子类的Leaf也就不需要去实现它,而是在Composite声明所有用来管理子类对象的方法。这样做不会出现Leaf做无用功的问题,不过由于不够透明,所以树叶和树枝类将不具有相同的接口,客户端的调用需要做相应的判断,带来了不便。

优点:安全组合模式只是规定了系统各个层次的最基础的一致性行为,而把组合(树节点)本身的方法(如树枝节点管理子类的addChild等方法)放到自身当中。这样就避免了上一种方式的安全性问题

缺点:由于叶子和分支有不同的接口,所以又失去了透明性。

透明模式VS安全模式:在这一模式中,相对于安全性,我们比较强调透明性。对于第一种方式中叶子节点不需要的方法可以使用空处理或者异常报告的方式来解决。

优点:

  • 定义了包含基本对象和组合对象的类层次结构。基本对象可以被组合成更复杂的组合对象,而这个组合对象又可以被组合,这样不断的递归下去,客户端代码中,任何用到基本对象的地方都可以使用组合对象。

  • 用户不用关心到底是处理一个叶节点还是处理一个组合组件,也就是用不着为定义组合而写一些选择判断语句了。(让客户端忽略了层次的差异,方便对整个层次结构进行控制)

  • 组合模式让客户端可以一致的使用组合结构和单个对象。

  • 简化客户端代码

  • 符合开闭原则

缺点:

  • 限制类型时较为复杂

  • 使设计变得更加抽象

  • 在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。

适用场景:

当发现需求中是体现部分与整体的层次结构时;以及你希望用户可以忽略组合对象与单个对象的不同,统一的使用组合结构中的所有对象时,就应该考虑用组合模式了。

当处理一个树型结构时。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/591819.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数组及详解冒泡排序

数组及详解冒泡排序 一维数组的创建和初始化一维数组的创建一维数组的初始化一维数组的应用一维数组在内存中的存储 二维数组的创建和初始化二维数组的创建二维数组的初始化二维数组的应用二维数组在内存中的存储 数组越界问题数组作为函数参数数组名的含义及特殊两个例子 冒泡…

PACS影像解决方案

现代医学影像技术的迅猛发展,使得PACS系统已逐渐成为各级医院实现信息化建设的重要组成部分。医学影像技术的进步也提升了医学影像的清晰度,推动二维PACS向三维升级转变。这一切都使得医学影像数据量激增,加之医疗行业法规的数据保存要求&…

对DataFrame指定字段进行整数编码df[‘字段名称‘].factorize()[0]

【小白从小学Python、C、Java】 【等级考试500强双证书考研】 【Python-数据分析】 对DataFrame指定字段进行整数编码 df[字段名称].factorize()[0] 选择题 关于以下代码说法错误的是: import pandas as pd myData pd.DataFrame({编码前: [A, B, C, A, B]}) …

Missing-Semester Lec1 Solution

操作系统: m a c O S M o n t e r e y v e r s i o n 12.6 macOS \ Monterey version \ 12.6 macOS Montereyversion 12.6 1、查看shell是否符合要求 echo $SHELL /bin/zsh2、在/tmp下新建一个名为missing的文件夹 mkdir missing3、用man查看程序touch的使用手册…

我要官宣了!

小伙伴们大家好,我是阿秀。 我做写文章已经两年多时间了,最开始是分享自己的读研时生活的的小事,后来慢慢记录自己的学习和秋招找工作。 在研三那年校招结束后,我开始系统的分享自己的学习过程,分享自己学习过程中所记…

国产数据库|GBase 8s V8.8 学习笔记之架构介绍

作者 | JiekeXu 来源 |公众号 JiekeXu DBA之路(ID: JiekeXu_IT) 如需转载请联系授权 | (个人微信 ID:JiekeXu_DBA) 大家好,我是 JiekeXu,很高兴又和大家见面了,今天和大家一起来看看国产数据库|GBase 8s V8.8 学习笔记之架构介绍&…

《计算机组成原理》唐朔飞 第10章 控制单元的设计 - 学习笔记

写在前面的话:此系列文章为笔者学习计算机组成原理时的个人笔记,分享出来与大家学习交流。使用教材为唐朔飞第3版,笔记目录大体与教材相同。 网课 计算机组成原理(哈工大刘宏伟)135讲(全)高清_…

Office project 2021安装

哈喽,大家好。今天一起学习的是project 2021的安装,Microsoft Office project项目管理工具软件,凝集了许多成熟的项目管理现代理论和方法,可以帮助项目管理者实现时间、资源、成本计划、控制。有兴趣的小伙伴也可以来一起试试手。…

Spring事务与事务传播

文章目录 一、什么是事务?二、Spring事务实现编程式事务声明式事务 三、Transactional的使用参数作用Spring事务的隔离级别事务失效的场景Transactional工作原理 四、Spring事务传播机制Spring有哪些事务传播机制? 一、什么是事务? 事务:事务是一组操…

Python十类常见异常类型(附捕获以及异常处理方式)

目录 前言十类异常1.TypeError2.ValueError3.NameError4.IndexError5.KeyError6.ZeroDivisionError7.IOError8.ImportError9.AttributeError10.KeyboardInterrupt 异常捕获以及处理总结 前言 大家好,我是辣条哥!今天给大家讲讲我们刚开始写代码是都会出现…

系统学习】Java基础3之反射

Java反射 反射机制概述 Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内 部属性及方法 加载完类之后,在堆内存的方法区中就产…

美债提高上限的后果

* * * 原创:刘教链 * * * 号外:今天在小号“刘教链Pro”发表了一篇《再论以太坊的自限性》,谈了一下对比特币和以太坊自限性问题的再研讨,欢迎关注“刘教链Pro”并阅读。 * * * 隔夜比特币小幅回落至28k下方。昨日在28k上方遭遇了…

在Centos Stream 9上Docker的实操教程(四) - Docker腾讯云远程仓库和本地私有仓库

在Centos Stream 9上Docker的实操教程 - Docker腾讯云远程仓库和本地私有仓库 本地镜像发布到腾讯云注册开通腾讯云初始化个人版服务创建仓库推送拉取镜像 私有仓库结语 本地镜像发布到腾讯云 由于官方的docker hub访问由于网络原因,可能会比较慢,博主推…

0301依赖使用以及配置优先级-基础-springboot2.7.x系列

文章目录 1 依赖方式1.1 spring-boot-starter-parent依赖1.2 spring-boot-dependencies依赖1.3 对比 2 使用方式2.1 SpringbootApplication2.2 高度定制 3 springboot各种配置优先级顺序4 sprinboot配置文件解析顺序结语 1 依赖方式 这里项目以开源的renren和pig为例&#xff…

Meta发布Megabyte AI模型抗衡Transformer

🚀 Meta发布Megabyte AI模型抗衡Transformer:解决后者已知问题、速度提升4成 摘要:Meta团队开发的Megabyte AI模型可以抗衡当前在自然语言处理领域非常流行的Transformer模型, 解决了Transformer模型所面临的训练速度较慢、难以…

【Java 并发编程】深入理解 AQS - AbstractQueuedSynchronizer

深入理解 AQS - AbstractQueuedSynchronizer 1. AQS1.1 什么是 AQS1.2 AQS 具备的特性 2. AQS 原理解析2.1 AQS 原理概述2.1.1 什么是 CLH 锁2.1.2 AQS 中的队列 2.2 AQS 共享资源的方式:独占式和共享式2.2.1 Exclusive(独占式)2.2.2 Share&a…

用 GPT-4 来面试,简直开挂啊!

公众号关注 “GitHubDaily” 设为 “星标”,每天带你逛 GitHub! 众所周知,ChatGPT 凭其超强的文本生成能力,成为了 2023 年最为火爆的 AI 应用之一。 几个月前,GPT-4 发布,又将 ChatGPT 的能力提升到了一个…

redis为何这么快

文章目录 概述基于内存的操作高效的数据存储结构设计高效的数据结构string底层实现SDS字符串长度处理杜绝缓冲区溢出减少内存重新分配的次数空间预分配惰性空间释放 list底层实现压缩列表(zipList)双端链表(linkList) hsah底层实现ziplist字典 set底层实现 zset底层实现ziplist…

“大厂的人一毕业,讲师就多了起来”——但培训行业,早就卷起来了

“大厂的人一毕业,讲师就多了起来”,很多中年产品经理都把去做培训当成一个后备选项,也许,作为十几年前就淌过路的人,可以给你一些信息。 总体来说,今年有个特别的体感,就是产品经理/产品思维/产…

【分布式应用】ELFK集群部署(Filebeat+ELK)Logstash的过滤模块

一、ELFK集群部署(FilebeatELK) ELFK ES logstashfilebeatkibana 实验环境 服务器类型系统和IP地址需要安装的组件硬件方面node1节点192.168.126.21JDK、elasticsearch-6.7.2、kibana-6.7.22核4Gnode2节点192.168.126.22JDK、elasticsearch-6.7.22核4…