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

3.组合模式

概述

处理树形结构或层次结构

业务场景:文件系统管理

假设你正在开发一个文件系统管理工具,文件系统中包含文件夹和文件。

1. 组件接口 (FileSystemComponent)

public interface FileSystemComponent {
    void showDetails(); // 显示文件或文件夹的详细信息
    long getSize(); // 获取文件或文件夹的大小
}

2. 叶子节点 (File)

public class File implements FileSystemComponent {
    private String name;
    private long size;

    public File(String name, long size) {
        this.name = name;
        this.size = size;
    }

    @Override
    public void showDetails() {
        System.out.println("文件: " + name + ",大小: " + size + " 字节");
    }

    @Override
    public long getSize() {
        return size;
    }
}

3. 组合节点 (Folder)

import java.util.ArrayList;
import java.util.List;

public class Folder implements FileSystemComponent {
    private String name;
    private List<FileSystemComponent> components = new ArrayList<>();

    public Folder(String name) {
        this.name = name;
    }

    public void addComponent(FileSystemComponent component) {
        components.add(component);
    }

    public void removeComponent(FileSystemComponent component) {
        components.remove(component);
    }

    @Override
    public void showDetails() {
        System.out.println("文件夹: " + name);
        for (FileSystemComponent component : components) {
            component.showDetails(); // 递归显示子组件详情
        }
    }

    @Override
    public long getSize() {
        long totalSize = 0;
        for (FileSystemComponent component : components) {
            totalSize += component.getSize(); // 递归计算文件夹大小
        }
        return totalSize;
    }
}

4. 客户端代码

public class FileSystemDemo {
    public static void main(String[] args) {
        // 创建文件
        FileSystemComponent file1 = new File("file1.txt", 100);
        FileSystemComponent file2 = new File("file2.txt", 200);
        FileSystemComponent file3 = new File("file3.txt", 300);

        // 创建文件夹
        Folder folder1 = new Folder("文件夹1");
        Folder folder2 = new Folder("文件夹2");

        // 将文件添加到文件夹
        folder1.addComponent(file1);
        folder1.addComponent(file2);
        folder2.addComponent(file3);

        // 将文件夹添加到另一个文件夹
        Folder rootFolder = new Folder("根文件夹");
        rootFolder.addComponent(folder1);
        rootFolder.addComponent(folder2);

        // 显示文件系统结构
        System.out.println("文件系统结构:");
        rootFolder.showDetails();

        // 计算文件系统总大小
        System.out.println("文件系统总大小: " + rootFolder.getSize() + " 字节");
    }
}

5. 输出

文件系统结构:
文件夹: 根文件夹
文件夹: 文件夹1
文件: file1.txt,大小: 100 字节
文件: file2.txt,大小: 200 字节
文件夹: 文件夹2
文件: file3.txt,大小: 300 字节
文件系统总大小: 600 字节

业务场景总结

  1. 问题:文件系统中文件夹和文件的操作需要统一处理,但它们的结构是树形的。

  2. 解决方案:使用组合模式,将文件夹和文件统一抽象为 FileSystemComponent,使得用户可以一致地处理单个文件和文件夹。

  3. 优点

    • 统一处理单个对象和组合对象,简化客户端代码。

    • 支持递归操作,如计算文件夹大小或显示文件结构。

    • 符合开闭原则,易于扩展新的组件类型。


其他业务场景

  1. 组织架构管理:公司中的部门和员工可以组成树形结构,统一管理。

  2. 菜单系统:菜单和菜单项可以组合成树形结构,支持递归操作。

  3. UI 组件:复杂的 UI 界面中,容器组件和叶子组件可以统一管理。

组合模式的核心思想是部分-整体,它通过树形结构统一管理单个对象和组合对象,使得用户可以一致地处理它们。

相关文章:

  • C++ Qt创建计时器
  • gazebo官方模型库物品
  • 通俗易懂的介绍LLM大模型技术常用专业名词(专业版)
  • 全原子 MD 结合自适应采样技术揭示 Hsp70 构象循环突变的分子机制
  • 前端学习——CSS
  • Scaled_dot_product_attention(SDPA)使用详解
  • 1.1Vue 3 核心优势与架构革新
  • Mac本地安装运行FastDFS
  • CSK6大模型语音开发板接入DeepSeek排错流程参考
  • java后端开发day29--常见算法(一)----查找与排序
  • Unity DOTS从入门到精通之 C# Job System
  • LeeCode题库第四十六题
  • 长上下文 GRPO
  • Core Speech Kit(基础语音服务)
  • Django与视图
  • 大整数加法(信息学奥赛一本通-1168)
  • 锂电池组的串数设计研究
  • QOJ9700 Ying’s Cup(拉格朗日插值优化卷积,背包,二项式反演)
  • c++ 嵌入汇编的方式实现int型自增
  • Javascript ajax
  • linux 网站开发/企业网站建设的步骤
  • 淄博政府网站建设专家/病毒式营销案例
  • 沈阳网站优化哪家好/项目平台
  • 泰安做网站优化/在哪里推广比较好
  • 企业 宣传 还要网站吗/搜索引擎营销优化策略有哪些
  • 软件代做网站在哪找活/站长