惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

有赞技术团队
有赞技术团队
H
Hackread – Cybersecurity News, Data Breaches, AI and More
I
InfoQ
J
Java Code Geeks
Microsoft Security Blog
Microsoft Security Blog
G
Google Developers Blog
D
DataBreaches.Net
Recent Announcements
Recent Announcements
Microsoft Azure Blog
Microsoft Azure Blog
B
Blog RSS Feed
Y
Y Combinator Blog
博客园 - 【当耐特】
博客园 - 聂微东
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
大猫的无限游戏
大猫的无限游戏
P
Proofpoint News Feed
量子位
C
Check Point Blog
F
Fortinet All Blogs
罗磊的独立博客
Last Week in AI
Last Week in AI
GbyAI
GbyAI
L
LangChain Blog
博客园 - 司徒正美

牛牛技术客栈

设计模式-备忘录模式 - OXOXTECH 牛牛技术客栈 设计模式-中介者模式 - OXOXTECH 牛牛技术客栈 Linux【Ubuntu】修改ssh默认端口 - OXOXTECH 牛牛技术客栈 设计模式-迭代器模式 - OXOXTECH 牛牛技术客栈 scheduled定时任务的三种基本实现方式 - OXOXTECH 牛牛技术客栈 Apriori - 基于关联规则的推荐算法(三) - OXOXTECH 牛牛技术客栈 Apriori - 基于关联规则的推荐算法(二) - OXOXTECH 牛牛技术客栈 Apriori - 基于关联规则的推荐算法(一) - OXOXTECH 牛牛技术客栈 基于JavaFX的桌面端网络调试工具 - OXOXTECH 牛牛技术客栈 Golang Channel的原理介绍 - OXOXTECH 牛牛技术客栈 Go语言Map的原理分析 - OXOXTECH 牛牛技术客栈 Go语言错误处理(panic)的最佳实践 - OXOXTECH 牛牛技术客栈 设计模式-解释器模式 - OXOXTECH 牛牛技术客栈 Redis报错Redis is configured to save RDB snapshots, but it's currently unable to persist to disk. go-webpbin库在Linux报错failed to encode image to WebP: exit status 1.......的问题 exe4j 打包加密的jar - OXOXTECH 牛牛技术客栈 Go生成图形验证码示例 - OXOXTECH 牛牛技术客栈 澳门一天游:一日尽享东方与西方的交融之美 - OXOXTECH 牛牛技术客栈 设计模式-命令模式 - OXOXTECH 牛牛技术客栈 别再自己瞎写工具类了,SpringBoot内置工具类应有尽有 - OXOXTECH 牛牛技术客栈 中山一日游 - OXOXTECH 牛牛技术客栈 设计模式-责任链模式 - OXOXTECH 牛牛技术客栈 起舞吧,齐舞吧 - OXOXTECH 牛牛技术客栈 Go语言Web开发|GoFrame框架入门笔记 - OXOXTECH 牛牛技术客栈 Java打包exe教程 - OXOXTECH 牛牛技术客栈 设计模式-代理模式 - OXOXTECH 牛牛技术客栈 MySQL存储过程的优缺点有哪些? - OXOXTECH 牛牛技术客栈 前端渲染优化有哪些? - OXOXTECH 牛牛技术客栈 HTTP状态码及其含义 - OXOXTECH 牛牛技术客栈 从浏览器地址栏输入url到显示页面的步骤 - OXOXTECH 牛牛技术客栈
设计模式-组合模式 - OXOXTECH 牛牛技术客栈
Jensen · 2024-07-24 · via 牛牛技术客栈

设计模式-组合模式

Jensen Java Java, 设计模式

前言

Java开发中,设计模式是常用的一种编码方式,合理使用设计模式可以帮助开发人员更快地编写出高效、可靠和可维护的代码。本期将撰写一个关于设计模式的系列文章,总共23种设计模式将以一篇一篇文章讲解,代码笔记已开源至:Gitee点击跳转。在上一篇《Java设计模式(10)代理模式》文章中,我们介绍了代理模式。本文是这个系列的第十一篇章,我们将讲解一下组合模式的实现方式、应用场景以及它的用途。

组合模式

组合模式是一种结构型设计模式,它将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得客户端对单个对象和组合对象的使用具有一致性。

使用场景

  • 树形结构:需要表示对象的部分-整体层次结构的系统。
  • 文件系统:文件夹和文件的层次结构。
  • GUI组件:窗口、面板和按钮等组件的层次结构。
  • 公司组织结构:公司、部门、员工的层次结构。

代码实现

本次我们来简单实现一下文件系统的树形结构

定义一个接口 FileSystemComponent 再创建一个目录类 Folder 和文件类 File并实现于 FileSystemComponent

/**
 * 文件系统接口
 * @author Jensen
 * @date 2024-04-01
 * */
public interface FileSystemComponent {
    void display(int depth);
}
/**
 * 目录类
 * @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));
    }
}
/**
 * 文件类
 * @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 方法则用于遍历这个目录结构

测试使用

此处示例将目录和文件的创建封装成一个方法

System.out.println("------------------------------组合模式-----------------------------");
Folder disk = createDisk();
disk.display(0);
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;
}

输出:

202407231804163783.webp

结语

组合模式通过将对象组合成树形结构,使得客户端可以一致地处理单个对象和组合对象,适用于表示部分-整体层次结构的系统。