前言
在Java开发中,设计模式是常用的一种编码方式,合理使用设计模式可以帮助开发人员更快地编写出高效、可靠和可维护的代码。本期将撰写一个关于设计模式的系列文章,总共23种设计模式将以一篇一篇文章讲解,代码笔记已开源至:Gitee点击跳转。在上一篇《Java设计模式(10)代理模式》文章中,我们介绍了代理模式。本文是这个系列的第十一篇章,我们将讲解一下组合模式的实现方式、应用场景以及它的用途。
组合模式
组合模式是一种结构型设计模式,它将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得客户端对单个对象和组合对象的使用具有一致性。
使用场景
- 树形结构:需要表示对象的部分-整体层次结构的系统。
- 文件系统:文件夹和文件的层次结构。
- GUI组件:窗口、面板和按钮等组件的层次结构。
- 公司组织结构:公司、部门、员工的层次结构。
代码实现
本次我们来简单实现一下文件系统的树形结构
定义一个接口 FileSystemComponent 再创建一个目录类 Folder 和文件类 File并实现于 FileSystemComponent
代码语言:javascript复制/**
* 文件系统接口
* @author Jensen
* @date 2024-04-01
* */
public interface FileSystemComponent {
void display(int depth);
}
代码语言:javascript复制/**
* 目录类
* @author Jensen
* @date 2024-04-01
* */
public class Folder implements FileSystemComponent {
private final String name;
private final List<FileSystemComponent> components = new ArrayList<>();
public Folder(String name) {
this.name = name;
}
public void addComponents(FileSystemComponent component){
components.add(component);
}
@Override
public void display(int depth) {
System.out.println("-".repeat(depth) name);
components.forEach(c->c.display(depth 1));
}
}
代码语言:javascript复制/**
* 文件类
* @author Jensen
* @date 2024-04-01
* */
public class File implements FileSystemComponent {
private final String name;
public File(String name) {
this.name = name;
}
@Override
public void display(int depth) {
System.out.println("-".repeat(depth) name);
}
}
其中 Folder 中实现了 addComponents 方法用于将文件添加到系统当中。而 display 方法则用于遍历这个目录结构
测试使用
此处示例将目录和文件的创建封装成一个方法
代码语言:javascript复制System.out.println("------------------------------组合模式-----------------------------");
Folder disk = createDisk();
disk.display(0);
代码语言:javascript复制 private static Folder createDisk() {
//创建磁盘
Folder disk = new Folder("Windows(C:) >");
//创建目录 Java
Folder java_folder1 = new Folder("Java");
//创建文件 test1.java和test2.java
File jar1 = new File("test1.java");
File jar2 = new File("test2.java");
//创建目录 Idea
Folder java_folder2 = new Folder("Idea");
//创建文件 test1.class和test2.class
File jar3 = new File("test1.class");
File jar4 = new File("test2.class");
//把各个文件添加到各自目录下
java_folder1.addComponents(jar3);
java_folder1.addComponents(jar4);
java_folder2.addComponents(jar1);
java_folder2.addComponents(jar2);
//把Idea目录添加到Java目录下
java_folder1.addComponents(java_folder2);
//创建目录 Golang
Folder go_folder1 = new Folder("Golang");
//创建文件 test1.go和test2.go
File go1 = new File("test1.go");
File go2 = new File("test2.go");
//把各个文件添加到目录下
go_folder1.addComponents(go1);
go_folder1.addComponents(go2);
//把目录添加到磁盘下
disk.addComponents(java_folder1);
disk.addComponents(go_folder1);
return disk;
}
输出:
结语
组合模式通过将对象组合成树形结构,使得客户端可以一致地处理单个对象和组合对象,适用于表示部分-整体层次结构的系统。