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

设计模式笔记_结构型_组合模式

1. 组合模式介绍

组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构来表示“整体/部分”层次结构。组合模式使得用户可以对单个对象组合对象进行一致的处理。

类比:想象一下文件系统中的目录和文件。一个目录可以包含多个文件,也可以包含其他目录。无论是文件还是目录,你都可以执行诸如打开、关闭等操作。组合模式就是这样一种设计,它使得你可以用统一的方式处理文件和目录。

优点

  1. 简化客户端代码:客户端代码可以一致地处理单个对象和组合对象,无需关心它们的具体类型。
  2. 易于扩展:可以轻松地增加新的组件类型,只需确保它们符合组合接口。
  3. 结构灵活:可以方便地创建复杂的递归结构,比如树形结构。

2. 代码演示

使用组合模式来模拟文件系统中的目录和文件。通过组合模式,我们可以将文件和目录统一处理,因为目录可以包含文件和其他子目录。

组件接口:

// 组件接口
public interface FileSystemComponent {//定义通用的showDetails()方法,用于展示组件的详细信息。void showDetails();
}

叶子节点 - 文件:

// File类实现了FileSystemComponent接口,代表文件
public class File implements FileSystemComponent {private String name;public File(String name) {this.name = name;}@Overridepublic void showDetails() {System.out.println("File: " + name);}
}

组合节点 - 目录:

// Directory类也实现了FileSystemComponent接口,代表目录。
// 目录可以包含多个FileSystemComponent,即可以包含文件和其他子目录。
public class Directory implements FileSystemComponent {private List<FileSystemComponent> components = new ArrayList<>();private String name;public Directory(String name) {this.name = name;}public void addComponent(FileSystemComponent component) {components.add(component);}public void removeComponent(FileSystemComponent component) {components.remove(component);}@Overridepublic void showDetails() {System.out.println("Directory: " + name);//多层目录结构,可递归处理for (FileSystemComponent component : components) {component.showDetails();}}
}

使用组合模式的客户端代码: 以相同的方式处理单个对象(File)和组合对象(Directory),无需关心它们的具体类型:

// 使用组合模式的客户端代码
public class FileSystemDemo {public static void main(String[] args) {// 创建文件File file1 = new File("file1.txt");File file2 = new File("file2.txt");// 创建目录1并添加文件Directory dir1 = new Directory("dir1");dir1.addComponent(file1);Directory dir2 = new Directory("dir2");dir2.addComponent(file2);dir2.addComponent(dir1); // 将dir1作为子目录添加到dir2// 显示目录结构: 文件和目录可以以统一的方式进行处理dir2.showDetails();}
}

对应的类图如下:

http://www.lryc.cn/news/617428.html

相关文章:

  • 5G NTN 卫星测试产品
  • 5G NR 非地面网络 (NTN) 5G、太空和统一网络
  • 用Python实现Excel转PDF并去除Spire.XLS水印
  • 深度剖析 Linux 信号:从基础概念到高级应用,全面解析其在进程管理与系统交互中的核心作用与底层运行机制
  • 电力仿真系统:技术革新与市场格局的深度解析
  • 【CV 目标检测】①——目标检测概述
  • 【Oracle】如何使用DBCA工具删除数据库?
  • 低延迟RTSP|RTMP视频链路在AI驱动无人机与机器人操控中的架构实践与性能优化
  • 排序与查找,简略版
  • 简单清晰的讲解一下RNN神经网络
  • 常用设计模式系列(十九)- 状态模式
  • EI检索-学术会议 | 人工智能、虚拟现实、可视化
  • 揭开内容分发网络(CDN)的神秘面纱:互联网的隐形加速器
  • 武汉火影数字|VR大空间是什么?如何打造VR大空间项目
  • 【线性基】 P3857 [TJOI2008] 彩灯|省选-
  • 第16届蓝桥杯Python青少组中/高级组选拔赛(STEMA)2024年10月20日真题
  • 【14-模型训练细节】
  • 基于Android的小区车辆管理系统
  • 让AI应用开发更简单——蚂蚁集团推出企业级AI集成解决方案
  • 论文中PDF的公式如何提取-公式提取
  • 闸机控制系统从设计到实现全解析:第 5 篇:RabbitMQ 消息队列与闸机通信设计
  • 覆盖近 1.5 万个物种,谷歌 DeepMind 发布 Perch 2.0,刷新生物声学分类检测 SOTA
  • 国内 Mac 开启 Apple Intelligence 教程
  • 【C++】哈希表的实现(unordered_map和unordered_set的底层)
  • Redis实现排行榜
  • 2025年渗透测试面试题总结-14(题目+回答)
  • 【MySQL基础篇】:MySQL索引——提升数据库查询性能的关键
  • 简单的身份验证中间件Tinyauth
  • 如何使用 Watchtower 实现定时更新 docker 中的镜像并自动更新容器(附 schedule 的参数详细解释)
  • 京东商品评论API秘籍!轻松获取商品评论数据