【设计模式】组合模式

文章目录

  • 1.组合模式定义
  • 2.组合模式的结构
    • 2.1. 安全式组合模式的结构
    • 2.2.透明式组合模式的结构
  • 3.组合模式实战案例
    • 3.1.场景说明
    • 3.2.关系类图
    • 3.3.代码实现
  • 4.组合模式优缺点
  • 5.组合模式适用场景
  • 6.组合模式总结

在这里插入图片描述

主页传送门:💁 传送

1.组合模式定义

       组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。

Compose objects into tree structure to represent part-whole hierarchies.Composite lets client treat individual objects and compositions of objects uniformly.

       即:将对象组合成树形结构以表示 “部分-整体” 的层次结构,使得用户对单个对象和组合对象的使用具有一致性。

2.组合模式的结构

组合模式的实现根据所实现接口的区别分为两种形式,分别称为安全式和透明式。

2.1. 安全式组合模式的结构

安全模式的组合模式要求管理聚集的方法只出现在树枝构件类中,而不出现在树叶构件类中。
在这里插入图片描述
  这种形式涉及到三个角色:

  • 抽象构件(Component)角色: 这是一个抽象角色,它给参加组合的对象定义出公共的接口及其默认行为,可以用来管理所有的子对象。合成对象通常把它所包含的子对象当做类型为Component的对象。在安全式的组合模式里,构件角色并不定义出管理子对象的方法,这一定义由树枝构件对象给出。

  • 树叶构件(Leaf)角色: 树叶对象是没有下级子对象的对象,定义出参加组合的原始对象的行为。

  • 树枝构件(Composite)角色: 代表参加组合的有下级子对象的对象。树枝构件类给出所有的管理子对象的方法,如add()、remove()以及getChild()。

安全式组合模式的缺点是不够透明,因为树叶类和树枝类将具有不同的接口。

2.2.透明式组合模式的结构

与安全式的组合模式不同的是,透明式的组合模式要求所有的具体构件类,不论树枝构件还是树叶构件,均符合一个固定接口。
在这里插入图片描述

3.组合模式实战案例

3.1.场景说明

       设计一个文件系统的杀毒软件,文件系统可以分为文件夹和文件,文件又分为文本文件,图片文件,视频文件。

3.2.关系类图

       使用组合模式来实现的结构图如下:
在这里插入图片描述

3.3.代码实现

//Component 抽象构件

/*** 抽象文件类:抽象构件接口*/
interface File {/*** 默认方法* @param file*/public default void add(File file) {throw new RuntimeException("reject");}public default void remove(File file) {throw new RuntimeException("reject");}public default File getChild(int index) {throw new RuntimeException("reject");}void killVirus();
}

//Leaf 叶子构件

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;/*** 图像文件类:叶子构建*/
@Data
@AllArgsConstructor
@NoArgsConstructor
class ImageFile implements File {private String name;@Overridepublic void killVirus() {System.out.println("---对图像文件:" + name + "正在杀毒!");}
}/*** 文本文件类:叶子构件*/
@Data
@AllArgsConstructor
@NoArgsConstructor
class TextFile implements File {private String name;@Overridepublic void killVirus() {System.out.println("---对文本文件:" + name + "正在杀毒!");}
}/*** 视频文件类:叶子构建*/
@Data
@AllArgsConstructor
@NoArgsConstructor
class VideoFile implements File {private String name;@Overridepublic void killVirus() {System.out.println("---对视频文件:" + name + "正在杀毒!");}
}

//Composite 容器构件

import java.util.ArrayList;
import java.util.List;/*** 文件夹类:容器构件*/
class Folder implements File {/*** 存储File类型的成员*/private List<File> fileList = new ArrayList<>();private String name;public Folder(String name) {this.name = name;}@Overridepublic void add(File file) {this.fileList.add(file);}@Overridepublic void remove(File file) {this.fileList.remove(file);}@Overridepublic File getChild(int index) {return this.fileList.get(index);}@Overridepublic void killVirus() {System.out.println("---对文件夹:" + name + "进行杀毒!");for (File file : fileList) {file.killVirus();}}
}

// 场景类

/*** 组合模式案例* @author Liucheng* @since 2019-07-26*/
public class Client {public static void main(String[] args) {File folder1 = new Folder("Sunny的资料");File folder2 = new Folder("图像文件");File folder3 = new Folder("文本文件");File folder4 = new Folder("视频文件");File file1 = new ImageFile("小龙女.jpg");File file2 = new ImageFile("张无忌.gif");File file3 = new TextFile("九阴真经.txt");File file4 = new TextFile("葵花宝典.doc");File file5 = new VideoFile("笑傲江湖.rmvb");folder2.add(file1);folder2.add(file2);folder3.add(file3);folder3.add(file4);folder4.add(file5);folder1.add(folder2);folder1.add(folder3);folder1.add(folder4);//从“Sunny的资料”节点开始进行杀毒操作folder1.killVirus();}
}

4.组合模式优缺点

组合模式是一种结构型设计模式,它允许将对象组合成树状的层次结构,以表示“整体-部分”的关系。组合模式的优点和缺点如下:

优点:

  • 简化客户端代码:组合模式使得客户端代码可以一致地处理单个对象和组合对象,无须关心自己处理的是单个对象还是组合对象,这简化了客户端代码。
  • 更容易添加新对象:在组合体内加入新的对象,客户端不会因为加入了新的对象而更改源代码,这符合“开闭原则”。

缺点:

  • 设计较复杂:客户端需要花更多时间理清类之间的层次关系。
  • 不容易限制容器中的构件:不容易用继承的方法来增加构件的新功能。

5.组合模式适用场景

组合模式适用于以下场景:

  1. 表示递归结构:组合模式适合用于表示树形或递归结构,例如文件系统、组织结构等,这些场景中需要对单个对象和组合对象进行一致处理。
  2. 客户端希望忽略差异:当客户端希望忽略组合对象与单个对象的差异时,可以使用组合模式,例如,客户端只需要对整个层次结构进行控制,而不关心具体的单个对象。
  3. 处理树形结构:组合模式适用于处理树形结构,需要对层次进行定义、忽略层次差异、简化客户端代码等。

总之,组合模式适用于处理树形结构或递归结构的场景,当客户端希望忽略差异、简化代码或符合开闭原则时,可以选择使用组合模式。同时需要注意其缺点,如设计复杂、不容易限制容器中的构件等。

6.组合模式总结

     组合模式是一种设计模式,旨在将对象组合成树形结构以表示“部分-整体”的层次结构。它允许客户端代码以一致的方式处理对象和对象容器,无需关心处理的单个对象还是组合的对象容器。
     总之,组合模式是一种有用的设计模式,可以在适当的情况下应用来简化客户端代码、降低耦合度和提高可扩展性。然而,它也有一些缺点和适用场景需要注意和考虑。

如果喜欢的话,欢迎 🤞关注 👍点赞 💬评论 🤝收藏 🙌一起讨论
你的支持就是我✍️创作的动力! 💞💞💞

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

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

相关文章

服务注册发现_actuator微服务信息完善

SpringCloud体系里的&#xff0c;服务实体向eureka注册时&#xff0c;注册名默认是IP名:应用名:应用端口名。 问题&#xff1a; 自定义服务在Eureka上的实例名怎么弄呢 在服务提供者pom中配置Actuator依赖 <!-- actuator监控信息完善 --> <dependency><groupId…

2 C++中的引用

C中的引用 上节说到&#xff0c;变量名实际上是一段连续存储空间的别名。很显然我们可以将其命名为其它名字&#xff0c;就像我们有乳名、小名一样。 C引入了引用的概念。 引用可以看作一个已定义变量的别名引用的语法 type& name variate;普通引用在声明时必须用其它的…

springboot和vue:二、springboot特点介绍+热部署热更新

springboot特点介绍 能够使用内嵌的Tomcat、Jetty服务器&#xff0c;不需要部署war文件。提供定制化的启动器Starters&#xff0c;简化Maven配置&#xff0c;开箱即用。纯Java配置&#xff0c;没有代码生成&#xff0c;也不需要XML配置。提供了生产级的服务监控方案&#xff0…

如何在 SOLIDWORKS中创建零件模板 硕迪科技

作为一款多功能且可大量定制的 3D CAD 软件&#xff0c;SOLIDWORKS模板可以通过自定义属性包含大量数据。可以通过为SOLIDWORKS零件、装配体和工程图创建模板来利用这些模板。 与其他一些CAD软件不同&#xff0c;SOLIDWORKS不限制您可以创建的模板数量 - 您可以根据需要创建任…

在项目中,关于前端实现数据可视化的技术选择

前言 在项目中&#xff0c;数据可视化以图表、报表类型为主。 需求背景 技术框架是Vue2.x版本&#xff0c;组件库是Ant Design of Vue能够支撑足够多的图表类型开发图表大小/位置能够随意变动图表样式需要支持丰富多样的用户配置强大、开放的图表语法支持复杂的数据可视化场景…

【深度学习实验】前馈神经网络(四):自定义逻辑回归模型:前向传播、反向传播算法

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入必要的工具包 1. 逻辑回归Logistic类 a. 构造函数__init__ b. __call__(self, x)方法 c. 前向传播forward d. 反向传播backward 2. 模型训练 3. 代码整合 一、实验介绍 实现逻…

Linux 目录结构介绍

对上面的说明: root 目录 &#xff1a; linux 超级权限 root 的主目录 home 目录 &#xff1a; 系统默认的用户主目录&#xff0c;如果添加用户是不指定用户的主目录&#xff0c;默认在/home 下创建与用户同名的文件夹 bin 目录 &#xff1a; 存放系统所需要的重要命令&am…

uniapp Echart X轴Y轴文字被遮挡怎么办,或未能铺满整个容器

有时候布局太小&#xff0c;使用echarts&#xff0c;x轴y轴文字容易被遮挡&#xff0c;怎么解决这个问题呢&#xff0c;或者是未能铺满整个容器。 方法1&#xff1a; 直接设置 containLabel 字段 options: { grid: { containLabel: true, },} 方法2: 间接设置&#xff0c;但是…

【新版】系统架构设计师 - 案例分析 - 信息安全

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录 架构 - 案例分析 - 信息安全安全架构安全模型分类BLP模型Biba模型Chinese Wall模型 信息安全整体架构设计WPDRRC模型各模型安全防范功能 网络安全体系架构设计开放系统互联安全体系结构安全服务与安全机制…

mysql workbench常用操作

1、No database selected Select the default DB to be used by double-clicking its name in the SCHEMAS list in the sidebar 方法一&#xff1a;双击你要使用的库 方法二&#xff1a;USE 数据库名 2、复制表名&#xff0c;字段名 3、保存链接

vue3+ts 实现移动端分页

current 开始页码 pageSize 结束页码 const sizeref<number>(10) //一页显示十条 const eachCurrentPageref<number>(1) //默认是第一页interface ITdata {current: number,pageSize: number,// xxxx 其他参数... } const selectApplyList ref<…

联想电脑打开exe提示要在Microsoft Store中搜索应用

问题&#xff1a; 你需要为此任务安装应用。 是否要在Microsoft Store中搜索一个&#xff1f; 如图&#xff1a; 出现此情况&#xff0c;仅需要做如下操作&#xff0c;在要打开的exe文件上右键&#xff0c;属性&#xff1a; 如图箭头所示&#xff0c;点击“解除锁定”出现对钩&…

<十二>objectARX开发:Arx注册命令类型的含义以及颜色索引对应RGB值

1、注册命令类型 我们经常在acrxEntryPoint.cpp中看到注册命令如下: 那么各个宏定义代表什么意思呢? 主标识:(常用的) ACRX_CMD_MODAL: 在别的命令执行的时候该命令不会在其中执行。ACRX_CMD_TRANSPARENT: 命令可以再其它命令中执行,但在该标志下ads_sssetfirst()不能使…

LeetCode 494.目标和 (动态规划 + 性能优化)二维数组 压缩成 一维数组

494. 目标和 - 力扣&#xff08;LeetCode&#xff09; 给你一个非负整数数组 nums 和一个整数 target 。 向数组中的每个整数前添加 或 - &#xff0c;然后串联起所有整数&#xff0c;可以构造一个 表达式 &#xff1a; 例如&#xff0c;nums [2, 1] &#xff0c;可以在 2…

用Redis做数据排名

1.背景 用Redis做数据缓存用的比较多&#xff0c;大家都能熟练使用String和Hash结构去存储数据&#xff0c;今天讲下如何使用ZSet来做数据排名。 假设场景是需要按天存储全国城市的得分数据&#xff0c;可以查询前十名的城市排名。 这个case可以使用传统关系型数据库做…

如何修复wmvcore.dll缺失问题,wmvcore.dll下载修复方法分享

近年来&#xff0c;电脑使用的普及率越来越高&#xff0c;人们在日常生活中离不开电脑。然而&#xff0c;有时候我们可能会遇到一些问题&#xff0c;其中之一就是wmvcore.dll缺失的问题。wmvcore.dll是Windows平台上用于支持Windows Media Player的动态链接库文件&#xff0c;如…

SD-MTSP:萤火虫算法(FA)求解单仓库多旅行商问题MATLAB(可更改数据集,旅行商的数量和起点)

一、萤火虫算法&#xff08;FA&#xff09;简介 萤火虫算法(Firefly Algorithm&#xff0c;FA)是Yang等人于2009年提出的一种仿生优化算法。 参考文献&#xff1a;田梦楚, 薄煜明, 陈志敏, et al. 萤火虫算法智能优化粒子滤波[J]. 自动化学报, 2016, 42(001):89-97. 二、单仓…

数量关系(刘文超)

解题技巧 代入排除法 数字特性法 整除特性 比例倍数特性&#xff08;找比例&#xff0c;比例不明显时找等式&#xff09; 看不懂式子时&#xff0c;把所有的信息像表格一样列出来 看不懂式子时&#xff0c;把所有的信息像表格一样列出来

【机器学习】期望最大算法(EM算法)解析:Expectation Maximization Algorithm

【机器学习】期望最大算法&#xff08;EM算法&#xff09;&#xff1a;Expectation Maximization Algorithm 文章目录 【机器学习】期望最大算法&#xff08;EM算法&#xff09;&#xff1a;Expectation Maximization Algorithm1. 介绍2. EM算法数学描述3. EM算法流程4. 两个问…

性能测试 —— Tomcat监控与调优:Jconsole监控

JConsole的图形用户界面是一个符合Java管理扩展(JMX)规范的监测工具&#xff0c;JConsole使用Java虚拟机(Java VM)&#xff0c;提供在Java平台上运行的应用程序的性能和资源消耗的信息。在Java平台&#xff0c;标准版(Java SE平台)6&#xff0c;JConsole的已经更新到目前的外观…