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

【设计模式-组合】

**Composite Pattern(组合模式)**是一种结构型设计模式,旨在将对象组合成树形结构,以表示“部分-整体”的层次结构。这种模式允许客户端以统一的方式处理单个对象和对象集合,从而简化了树形结构的处理。

核心思想

组合模式通过将对象和组合对象(即子对象)封装在统一的接口中,使得客户端可以以一致的方式处理这些对象。这样,无论是处理单个对象还是处理由多个对象组成的集合,客户端的操作都不会改变。

组成部分

  • Component(组件): 这是一个接口或抽象类,声明了叶子节点和复合节点的共同操作接口。例如,它可能声明了 add, remove, getChild, 和其他一些操作。

  • Leaf(叶子节点): 叶子节点实现了 Component 接口,并定义了叶子节点特有的行为。叶子节点是树形结构中的末端元素,不能有子节点。

  • Composite(复合节点): 复合节点也实现了 Component 接口,维护了一个子组件的集合,并定义了对这些子组件的操作方法(如 add, remove, getChild)。复合节点可以包含叶子节点或其他复合节点。

UML图

在这里插入图片描述

Java代码

以下是一个简单的示例,展示了如何在 Java 中实现组合模式。这个示例构建了一个文件系统的树形结构,其中包含文件和文件夹(文件夹可以包含其他文件夹和文件)。

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

// Component
interface FileSystemComponent {
    void print(String indent);
}

// Leaf
class File implements FileSystemComponent {
    private String name;

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

    @Override
    public void print(String indent) {
        System.out.println(indent + "File: " + name);
    }
}

// Composite
class Folder implements FileSystemComponent {
    private String name;
    private List<FileSystemComponent> children = new ArrayList<>();

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

    public void add(FileSystemComponent component) {
        children.add(component);
    }

    public void remove(FileSystemComponent component) {
        children.remove(component);
    }

    public FileSystemComponent getChild(int index) {
        return children.get(index);
    }

    @Override
    public void print(String indent) {
        System.out.println(indent + "Folder: " + name);
        for (FileSystemComponent child : children) {
            child.print(indent + "  ");
        }
    }
}

// Client
public class CompositePatternExample {
    public static void main(String[] args) {
        FileSystemComponent file1 = new File("file1.txt");
        FileSystemComponent file2 = new File("file2.txt");

        Folder folder1 = new Folder("folder1");
        Folder folder2 = new Folder("folder2");
        folder1.add(file1);
        folder1.add(folder2);
        folder2.add(file2);

        Folder rootFolder = new Folder("root");
        rootFolder.add(folder1);

        rootFolder.print("");
    }
}

解释

  • Component(FileSystemComponent): 这是一个接口,定义了所有文件系统组件的公共操作方法 print,用于输出组件信息。

  • Leaf(File): 实现了 FileSystemComponent 接口,表示文件。文件具有一个名称,并且可以输出自身的信息。

  • Composite(Folder): 也实现了 FileSystemComponent 接口,表示文件夹。文件夹可以包含其他文件夹或文件,并且能够递归地打印所有子组件的信息。

优点

  1. 一致的接口: 组合模式提供了一个统一的接口,客户端无需关心对象的具体类型,无论是处理单一对象还是对象组合,使用方式相同。

  2. 易于扩展: 新的叶子节点或复合节点可以很容易地加入现有系统中,而不需要修改现有的代码。

  3. 简化客户端代码: 客户端代码可以用相同的方式处理单个对象和对象组合,简化了操作和维护。

缺点

  1. 设计复杂: 组合模式可能会导致设计复杂,因为需要处理递归结构以及可能需要大量的子类。

  2. 性能开销: 在处理复杂的树形结构时,可能会有较大的性能开销,特别是在树的深度很大时。

使用场景

  • 文件系统: 典型的应用场景,如文件和文件夹的组织结构。
  • 图形用户界面(GUI): GUI 元素如按钮、面板和对话框可以通过组合模式进行管理。
  • 组织结构: 处理公司或团队的组织结构图。

组合模式通过将对象结构建模为树形结构,使得客户端能够以一致的方式处理各种对象,尤其适合处理层次结构问题。


http://www.kler.cn/news/319711.html

相关文章:

  • 【Git入门】使用 Git 进行项目管理:Word Count 程序开发与托管
  • Redis安全
  • Java语法-类和对象(上)
  • 《开题报告》基于SpringBoot的社区团购系统的设计与实现+学习文档+答辩讲解视频
  • 编译win2k3中tools目录下i386mk.inc文件的作用
  • Java 微服务框架 HP-SOA v1.1.4
  • 【网络】高级IO——Reactor版TCP服务器
  • 刷题训练之栈
  • 系统敏感信息搜索工具(支持Windows、Linux)
  • Unnity IOS安卓启动黑屏加图(底图+Logo gif也行)
  • docker中搭建nacos并将springboot项目的配置文件转移到nacos中
  • 流 Stream
  • 代码随想录算法训练营第二十天 | Java |530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先
  • 聚观早报 | 小米三折叠手机专利曝光;李斌谈合肥投资蔚来
  • K8S服务发布
  • 操作系统 | 学习笔记 | | 王道 | 5.3 磁盘和固态硬盘
  • Qwen大型语言模型系列的最新成果 ----Qwen2.5
  • 设备稳定流畅视频体验,乐鑫ESP32-S3芯片方案无线音视频传输通信
  • docker和docker-compose安装
  • 【计算机网络】理解应用层协议HTTP
  • Codeforces 1338A —— Powered Addition 题解
  • 持续学习与创新能力的双重提升
  • javaseday31多线程
  • Node.js 学习 path模块、fs模块、npm软件包管理器、导出、导入
  • 通信工程学习:什么是VPN虚拟专用网络
  • 微服务配置中心介绍
  • 计算机毕业设计之:基于微信小程序的校园流浪猫收养系统
  • 【24华为杯数模研赛赛题思路已出】国赛B题思路丨附参考代码丨免费分享
  • 应用层 I(C/S模型、P2P模型、域名系统DNS)【★★】
  • can not run elasticsearch as root