当前位置: 首页 > news >正文

23种设计模式【结构型模式】详细介绍之【组合模式】

23种设计模式【结构型模式】详细介绍之【组合模式】

  • 设计模式的分类和应用场景总结
  • 组合模式详解
    • 1. 概述
    • 2. 组成部分
    • 3. 实现方式
    • 4. 组合模式的优缺点
      • 4.1 优点
      • 4.2 缺点
    • 5. 使用场景
    • 6. 实际应用
    • 7. 总结

设计模式的分类和应用场景总结

可以查看专栏设计模式:设计模式

组合模式详解

组合模式是一种结构型设计模式,旨在将对象组合成树形结构以表示“部分-整体”的层次结构,使客户端能够以一致的方式处理单个对象和组合对象。

1. 概述

组合模式允许将对象组合成树状结构,从而能够统一处理个体对象和组合对象。适用于表示层次结构的数据,如文件系统、图形界面组件、组织结构等。

2. 组成部分

  • 组件(Component): 定义了对象的接口,可以包含默认行为。
  • 叶子(Leaf): 表示树的叶节点,不能有子节点,通常实现基本操作。
  • 组合(Composite): 容器对象,定义有子部件的行为,存储和操作子部件。

3. 实现方式

以下是组合模式的实现示例:

import java.util.ArrayList;
import java.util.List;// 组件接口
interface Component {void operation();
}// 叶子节点
class Leaf implements Component {private String name;public Leaf(String name) {this.name = name;}@Overridepublic void operation() {System.out.println("Leaf " + name + " operation");}
}// 组合节点
class Composite implements Component {private List<Component> children = new ArrayList<>();public void add(Component component) {children.add(component);}public void remove(Component component) {children.remove(component);}@Overridepublic void operation() {System.out.println("Composite operation");for (Component child : children) {child.operation();}}
}// 客户端代码
public class Client {public static void main(String[] args) {Leaf leaf1 = new Leaf("1");Leaf leaf2 = new Leaf("2");Composite composite = new Composite();composite.add(leaf1);composite.add(leaf2);Composite root = new Composite();root.add(composite);root.add(new Leaf("3"));root.operation();}
}

4. 组合模式的优缺点

4.1 优点

  • 一致性: 客户端可以一致地使用组合和叶子节点。
  • 简化客户端代码: 处理复杂树结构时不需关心对象的类型。
  • 易于扩展: 方便添加新类型的叶子或组合类。

4.2 缺点

  • 设计复杂性增加: 需要创建较多的类来表示树的节点和组合。
  • 可能产生过多的对象: 当组件数量过多时,可能增加系统开销。

5. 使用场景

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

  • 表示对象的部分-整体层次结构: 如文件系统、菜单系统、组织结构等。
  • 客户端需要统一处理组合对象和单个对象: 简化客户端代码。

6. 实际应用

  • 文件系统: 文件和文件夹可以作为叶子和组合,统一处理。
  • GUI组件: 按钮、窗口、面板等可以作为组合组件。
  • 企业组织结构: 部门和员工可以组合成树形结构。

7. 总结

组合模式通过将对象组合成树形结构,使客户端可以统一地处理单个对象和组合对象,增强了系统的灵活性和可扩展性。它是一种非常有效的方式来管理和操作层次结构数据,简化了复杂结构的管理。

版权声明:
原创博主:牛哄哄的柯南
博主原文链接:https://keafmd.blog.csdn.net/
个人博客链接:https://www.keafmd.top/

看完如果对你有帮助,感谢点击下面的点赞支持!
[哈哈][抱拳]

在这里插入图片描述
加油!

共同努力!

Keafmd

感谢支持牛哄哄的柯南,期待你的三连+关注~~

keep accumulate for my dream【共勉】

                                                       ↓   ↓   ↓   ↓   ↓   ↓  

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【分布式锁】Redission实现分布式锁
  • 杰发科技Bootloader(1)—— Keil配置地址
  • Vuex数据持久化实现
  • 若依Vue前后端分离版如何部署(windows)(超详细)
  • Python爬虫(5) --爬取网页视频
  • MacOS安装SDKMan管理Java版本
  • libtins初探-抓包嗅探
  • 微信小程序canvas 使用案例(一)
  • android13读取cpu频率,并调整频率
  • 【环境搭建】使用openSfM+MVSNet重建稠密点云
  • 数据结构初阶-单链表
  • Mysql随记
  • 阿里云OSS对象存储的项目实战操作
  • uniapp中给data中的变量赋值报错
  • matlab仿真 模拟调制(下)
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • nginx 负载服务器优化
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • PHP那些事儿
  • Python进阶细节
  • 从零开始的无人驾驶 1
  • 从输入URL到页面加载发生了什么
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 如何学习JavaEE,项目又该如何做?
  • 我有几个粽子,和一个故事
  • 小程序button引导用户授权
  • ​MySQL主从复制一致性检测
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • ​业务双活的数据切换思路设计(下)
  • # 计算机视觉入门
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (附源码)springboot教学评价 毕业设计 641310
  • (规划)24届春招和25届暑假实习路线准备规划
  • (每日一问)设计模式:设计模式的原则与分类——如何提升代码质量?
  • (四十一)大数据实战——spark的yarn模式生产环境部署
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • .net core 的缓存方案
  • .NET gRPC 和RESTful简单对比
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • .NET8使用VS2022打包Docker镜像
  • .NET下ASPX编程的几个小问题
  • ?php echo ?,?php echo Hello world!;?
  • [ACM独立出版] 2024年虚拟现实、图像和信号处理国际学术会议(VRISP 2024,8月2日-4)
  • [DNS网络] 网页无法打开、显示不全、加载卡顿缓慢 | 解决方案
  • [EFI]NUC11电脑 Hackintosh 黑苹果efi引导文件
  • [Go WebSocket] 多房间的聊天室(三)自动清理无人房间
  • [HackMyVM]靶场 Wild
  • [Hadoop in China 2011] Hadoop之上 中国移动“大云”系统解析
  • [Java]快速入门二叉树,手撕相关面试题
  • [JavaEE系列] Thread类的基本用法