设计模式之~组合模式

组合模式:

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

结构图:

实例:

透明方式: 

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

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

透明模式的特点:

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

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

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

安全方式:

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

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

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

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

优点:

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

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

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

  • 简化客户端代码

  • 符合开闭原则

缺点:

  • 限制类型时较为复杂

  • 使设计变得更加抽象

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

适用场景:

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

当处理一个树型结构时。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

煤矿井下定位设备,实现特殊环境下人员安全管理

煤矿、金属矿山等地下作业场所的安全管理工作要求高、难度大,矿用人员定位系统通过实时定位等功能,可以帮助企业随时掌握作业人员的位置安全,提高生产和安全管理效率,并可在紧急情况时迅速采取措施,减少事故损失&#…

基于OA的采购系统和专业的招标采购管理系统区别

当前采购信息化百家争鸣,既有初级版的审批和记录电子化,也有中级版的业务全流程电子化,还有升级版的数智化创新形式(如电商平台、智能评标、供应商风险评估、专家行为画像、大数据统计分析等)。 近年来,招标…

EBU6304 Software Engineering 知识点总结_4 analysis, design, implementation, testing

analysis 仅仅从用户的需求来看得到的消息不全面,还需要分析。用户可能认为你明白了,或者他考虑不全面,觉得一些地方是不需要的。 因此我们需要分析来 Refining requirements。 gather requirements-analyse in real world context-develo…

Apache网页安全与安全优化--网页缓存、隐藏版本信息、Apache 防盗链

目录 --------网页缓存-------- 1.检查是否安装 mod_expires 模块 2.如果没有安装mod_expires 模块,重新编译安装 Apache 添加 mod_expires模块 3.配置 mod_expires 模块启用 4.检查安装情况,启动服务 5.测试缓存是否生效 --------隐藏版本信息--…

Nginx+Tomcat(多实例)实现动静分离和负载均衡四层、七层(总有些惊奇的际遇,比方说当我遇见你)

文章目录 一、Tomcat 多实例部署二、反向代理的两种类型三、NginxTomcat实现负载均衡和动静分离(七层代理)1.动静分离和负载均衡原理2.实现方法3.部署实例(1)部署Nginx负载均衡服务器(2)配置Tomcat多实例服…

web的基本漏洞--弱口令漏洞

目录 一、弱口令漏洞介绍 1.弱口令漏洞的原理 2.漏洞识别 3.攻击方式 4.漏洞的危害 5.漏洞防御 一、弱口令漏洞介绍 弱口令漏洞是指系统登录口令的设置强度不高,容易被攻击者猜到或破解。造成弱口令漏洞的主要原因是系统的运维人员、管理人员安全意识不足。 弱…

Java领域的序列化与反序列化,Java的对象如何传输,常用序列化技术

文章目录 一、引出问题:Java原生的序列化1、基于Socket传输对象案例2、什么是序列化3、Java 原生序列化4、serialVersionUID 的作用5、transient 关键字绕开 transient 机制的办法writeObject 和 readObject 原理 6、Java 序列化的一些简单总结 二、分布式架构下常见…

python基础知识(八):字典

目录 1. 字典及其创建2. 字典元素的获取3. 字典元素的删除与清空4. 字典元素的增加5. 字典元素的修改6. 字典的键、值和键值对的获取7. 字典元素的遍历8. 字典的特点9. 字典生成式 1. 字典及其创建 在Python中,字典是一系列键—值对。每个键都与一个值相关联&#…

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…

小学课后兴趣班选课平台的设计与实现(ASP.NET,SQLServer)

系统功能模块设计 中小学课后兴趣班选课平台包括前台功能模块和后台功能模块:前台功能模块是给会员使用的功能模块,在前台功能模块中会员可以实现在线注册,登录,查看发布的新闻资讯信息,查看教师,在线留言&…

SouapUI接口测试之创建性能测试

SouapUI也是一个能生动的体现一个系统(项目)性能状态的工具,本篇就来说说如何在SouapUI工具下创建性能测试 一、创建测试用例 由于在《SouapUI接口测试之使用Excel进行参数化》篇已经创建好了测试用例,本篇就不讲解如何创建测试…

360浏览器如何屏蔽某搜索网站的热搜

1.安装油猴(Tampermonkey插件) 下载油猴:官网油猴tampermonkey官网_油猴脚本手机版油猴插件下载 安装:360浏览器安装可以参考这边文章。 地址:http://www.xz7.com/article/86938.html 其实就是下载crx文件后&#xff…

6月6号软件资讯更新合集......

Yao 0.10.3 正式发布,拥抱 AIGC 时代! ChatGPT 解锁了新的人机交互方式,人类可以与电脑直接交流了!AIGC 时代已经到来,万千应用正在升级或重构,Yao 提供了一个开箱即用的解决方案,可以快速开发…

Spark SQL概述、数据帧与数据集

文章目录 一、准备工作1、准备数据文件2、启动Spark Shell 二、加载数据为Dataset1、读文件得数据集 三、给数据集添加元数据信息1、定义学生样例类2、导入隐式转换3、将数据集转换成学生数据集4、对学生数据集进行操作(1)显示数据集内容(2&a…

Zabbix5通过脚本自定义Nginx监控

1、客户端配置 1.1、nginx开启nginx status 使用 zabbix 监控 nginx,首先 nginx 需要配置 ngx_status,nginx.conf加入以下配置,并重启Nginx或reload location /ngx_status { stub_status on; access_log off; #allow 127.0.0.1; #deny all…

【操作系统】03.内存管理

存储器的层级结构 程序的运行 现代操作系统使用的连接方式:运行时动态链接 对某些模块的链接推迟到程序执行时才进行 现代操作系统使用的装入方式:动态重定位 程序装入内存后,逻辑地址不会立即转换成物理地址,而是推迟到指令执行…

Linux 终端安装并使用tmux管理远程会话 tmux使用教程

文章目录 1 Tmux简介1.1 会话与窗口1.2 tmux功能 2 tmux安装2.1 源码安装2.2 命令行安装 3 基本用法(命令行)3.1 创建窗口3.2 分离会话 切换会话3.3 连接会话3.4 关闭会话并杀死进行对会话进行重命名 4 Tmux 的快捷键5 窗口操作与窗格操作参考 1 Tmux简介…

【事务】@Transactional 注解参数详解

文章目录 前言一、参数详解1.1、isolation(事务隔离级别)1.2、propagation(事务传播机制)1.3、readOnly(事务读写性)1.4、noRollbackFor 和 noRollbackForClassName(遇到时不回滚)1.…

智能出行 驱动未来|2023 开放原子全球开源峰会 CARSMOS 开源智能出行生态年会即将启幕

由开放原子开源基金会主办,元遨 / CARSMOS 开源智能出行项目组协办,深信科创、Futurewei Technologies、Open Motors、北极雄芯等单位共同承办的 2023 开放原子全球开源峰会 “CARSMOS 开源智能出行生态年会” 将于 6 月 12 日在北京经开区北人亦创国际会…

华为OD机试真题 Java 实现【分糖果】【2022Q2 200分】,附详细解题思路

一、题目描述 小明从糖果盒中随意抓一把糖果,每次小明会取出一半的糖果分给同学们。 当糖果不能平均分配时,小明可以选择从糖果盒中(假设盒中糖果足够)取出一个糖果或放回一个糖果。 小明最少需要多少次(取出、放回…
最新文章