设计模式之~组合模式

news/2024/12/2 15:36:15/

组合模式:

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

结构图:

实例:

透明方式: 

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

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

透明模式的特点:

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

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

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

安全方式:

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

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

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

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

优点:

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

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

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

  • 简化客户端代码

  • 符合开闭原则

缺点:

  • 限制类型时较为复杂

  • 使设计变得更加抽象

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

适用场景:

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

当处理一个树型结构时。


http://www.ppmy.cn/news/112012.html

相关文章

Spring Security的账号密码登录+Azure AD的授权登录集成Demo

一、项目准备&#xff1a; 1.创建一个Springboot项目。 2.注册一个微软的Azure AD服务&#xff0c;并且注册应用&#xff0c;创建用户。 springboot项目pom文件如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"…

WuThreat身份安全云-TVD每日漏洞情报-2023-05-24

漏洞名称:Tenda AC5 远程代码执行&#xff08;RCE&#xff09;漏洞 漏洞级别:严重 漏洞编号:CVE-2023-31587,CNNVD-202305-1519 相关涉及:Tenda AC5 V15.03.06.28版本 漏洞状态:POC 参考链接:https://tvd.wuthreat.com/#/listDetail?TVD_IDTVD-2023-12256 漏洞名称:Broadcom …

Android 更新后跑不起来?快来适配 AGP8 和 Flamingo/JDK 17

随着 Android Studio Flamingo 正式版的发布&#xff0c;AGP 8&#xff08;Android Gradle Plugin 8&#xff09;也正式进入大家的视野&#xff0c;这次 AGP 8 相关更新属于「断代式」更新&#xff0c;同时如果想体验 AGP 8&#xff0c;就需要升级到 Android Studio Flamingo 版…

vue中this.$set的用法

this.$set( target, key, value ) target&#xff1a;要更改的数据源(可以是对象或者数组) key&#xff1a;要更改的具体数据 value &#xff1a;重新赋的值 当我们给对象加了一个属性&#xff0c;在控制台能打印出来&#xff0c;但是却没有更新到视图上时&#xff0c;这个时…

空气净化器评测

http://jd.zol.com.cn/668/6688224.html

华为智选 720 全效空气净化器 评测

华为智选 720 全效空气净化器 2 采用 UltraClean 全效净化 — 内外一体 6 重循环净化&#xff0c;真正实现除醛、除菌、除霾、除味、除毒气溶胶。华为智选 720新品活动188红包等你抢机会不容错过http://www.adiannao.cn 整机的内部风道优化后&#xff0c;净化能力更上一层楼&am…

空气净化器什么牌子好,家用空气净化器哪个牌子好推荐

空气净化器什么牌子好&#xff0c;冰尊空气净化器是领导品牌效果最好&#xff01;现代生活中我们面临着越来越多的空气污染问题&#xff0c;包括PM2.5、VOC等有害物质对人体健康的影响。尤其是在城市和工业区等地区&#xff0c;空气质量更加恶劣&#xff0c;给我们的健康带来了…