当前位置: 首页 > 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.dtcms.com/a/326037.html

相关文章:

  • React(四):事件总线、setState的细节、PureComponent、ref
  • Jenkins 搭建鸿蒙打包
  • 【k8s】k8s中的几个概念性问题
  • day48 力扣739. 每日温度 力扣496.下一个更大元素 I 力扣503.下一个更大元素II
  • 轻量级解决方案:如何高效处理Word转PDF?
  • k8s的calico是什么作用,举例一下
  • 【2025最新版】PDF24 Creator,PDF编辑,合并分割,格式转换全能工具箱,本地离线版本,完全免费!
  • 【C语言强化训练16天】--从基础到进阶的蜕变之旅:Day1
  • 【12-激活函数】
  • 【PRML】分类
  • 普通大学本科生如何入门强化学习?
  • 算法73. 矩阵置零
  • MySQL权限管理和MySQL备份
  • 银行客户经营:用企业微信精准破解触达断层、效率瓶颈、数据孤岛三个痛点
  • GPT-5 全面解析与最佳实践指南
  • 容器 K8S Docker Kata 学习(一)
  • idea三个环境变量设置
  • Spring Boot Excel数据导入数据库实现详解
  • Spring-Security-5.7.11升级6.5.2
  • Socket(套接字)网络编程
  • Scala异步任务编排与弹性容错机制
  • [特殊字符]走进标杆工厂参观研学| 破茧成蝶的感悟之旅
  • Spring Boot 中 @Transactional 解析
  • Spring Boot启动事件详解:类型、监听与实战应用
  • PyCharm(2025.1.3.1)绑定 Conda 环境
  • SoftCnKiller:绿色小巧,流氓软件一键扫描!
  • 得物,三七互娱,游卡快手26秋招内推
  • 麒麟系统使用-PATH设置
  • 【Figma】Figma基础笔记二,常用快捷键和操作
  • 集成电路学习:什么是URDF Model统一机器人描述格式模型