首页 > 其他分享 >组合模式

组合模式

时间:2024-09-17 15:01:52浏览次数:8  
标签:name 组合 模式 文件夹 File Folder public

组合模式

组合模式(Composite Pattern)是一种结构型设计模式,用于将对象组合成树形结构以表示“部分-整体”的层次关系。它允许客户端以统一的方式处理单个对象和对象集合,使得客户端不需要区分具体的对象类型,从而简化了代码的处理逻辑。

主要组成部分

  1. Component(组件):定义了叶子对象和组合对象的共同接口。通常是一个抽象类或接口,声明了叶子和组合都实现的方法。
  2. Leaf(叶子):实现了 Component 接口,表示树的基本节点,通常没有子节点。
  3. Composite(组合):同样实现了 Component 接口,表示树的节点,它可以有一个或多个子组件,这些子组件可以是其他组合节点或叶子节点。

优点

  • 简化客户端代码:客户端代码可以统一处理单个对象和对象集合。
  • 支持递归结构:能够自然地处理树形结构。
  • 易于扩展:可以很容易地增加新的叶子节点或组合节点。

缺点

  • 设计复杂:可能会使系统设计变得复杂,因为需要管理层次结构和递归操作。
  • 性能问题:对于非常大的树形结构,可能会影响性能,特别是递归操作时。

示例

假设我们有一个文件系统,其中包含文件和文件夹。文件夹可以包含多个文件和其他文件夹。我们可以使用组合模式来表示这一结构。

FileSystemComponent.java

abstract class FileSystemComponent {
    abstract void showDetails();
}

File.java(叶子节点):

public class File extends FileSystemComponent {
    private String name;

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

    @Override
    void showDetails() {
        System.out.println("文件: " + name);
    }
}

Folder.java(组合节点):

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

public class Folder extends 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);
    }

    @Override
    void showDetails() {
        System.out.println("文件夹: " + name);
        for (FileSystemComponent component : children) {
            component.showDetails();
        }
    }
}

TestCompositePattern.java

public class TestCompositePattern {
    public static void main(String[] args) {
        // 创建文件
        File file1 = new File("File1.txt");
        File file2 = new File("File2.txt");
        File file3 = new File("File3.txt");

        // 创建文件夹
        Folder folder1 = new Folder("Folder1");
        Folder folder2 = new Folder("Folder2");

        // 将文件添加到文件夹中
        folder1.add(file1);
        folder1.add(file2);

        folder2.add(file3);
        folder2.add(folder1); // 将folder1添加到folder2中

        // 创建根文件夹
        Folder rootFolder = new Folder("RootFolder");
        rootFolder.add(folder2);

        // 显示文件系统结构
        rootFolder.showDetails();
    }
}

运行效果

运行 TestCompositePattern 类的 main 方法,得到类似如下的输出:

文件夹: RootFolder
文件夹: Folder2
文件: File3.txt
文件夹: Folder1
文件: File1.txt
文件: File2.txt

使用场景

  • 文件系统:文件夹和文件构成了一个树形结构。
  • 图形界面:用户界面组件(窗口、面板、按钮)也可以用树形结构来表示。
  • 组织结构:企业中的部门和员工之间的层次结构可以用组合模式表示。

组合模式在处理树形结构数据时非常有用,能够将复杂的数据组织结构简化为一致的操作接口。

标签:name,组合,模式,文件夹,File,Folder,public
From: https://www.cnblogs.com/20lxj666/p/18388643

相关文章

  • 桥接模式
    桥接模式桥接模式(BridgePattern)是一种结构型设计模式,它通过将抽象部分与实现部分分离,从而使它们可以独立地变化。这个模式的主要目的是解耦抽象和实现,使得它们可以独立地变化和扩展。主要概念抽象(Abstraction):这是一个接口或抽象类,它定义了高层次的操作。修正抽象(RefinedA......
  • 【加密算法基础——AES CBC模式代码解密实践】
    AES解密实践之代码实现AES解密使用python脚本比较灵活,但是一定要保证脚本是调试过的,才能在找到正确的密文,密钥,初始向量的情况下,解出正确的明文。但是对于AES解密,命令行无法处理key截断的问题。实际测试了一下,CBC模式,对于key截断的问题可以解决,但是CFB模式,目前还无法实验......
  • 设计模式---- 门面模式
    门面模式门面模式(FacadePattern)是一种结构型设计模式,用于为复杂子系统提供一个统一、简单的接口,隐藏系统的复杂性。通过门面模式,客户端无需直接与系统的内部组件交互,而是通过门面类与系统打交道,简化了客户端的使用,降低了系统的复杂性和耦合度。门面模式的主要概念定义:门面模......
  • 攻防世界 ————新手模式适合作为桌面 misc
    (本篇文章参考大佬的解题)下载附件,得到rar的的压缩包,解压缩,打开文件后有一张图片:打开图片发现什么也没有:使用软件Stegsolve打开图片看有什么问题:点击下一页:点击后发现有一个二维码:把他保存下来,使用软件扫码看看里面有什么:(我是用微信扫码的)出现了十六进制的数字:把他复......
  • 设计模式---- 工厂模式
    工厂模式工厂模式是一种创建型设计模式,它的主要目的是将对象的创建过程与对象的使用过程分离。工厂模式通过引入工厂类或者工厂方法,隐藏对象创建的复杂性,使得代码更加灵活、可扩展。工厂模式的使用场景主要在于:当我们需要对创建的对象进行封装或延迟创建时,工厂模式是一个很好的选......
  • 反DDD模式之关系型数据库
    本文书接上回《图穷匕见-所有反DDD模式都是垃圾》,关注公众号(老肖想当外语大佬)获取信息:最新文章更新;DDD框架源码(.NET、Java双平台);加群畅聊,建模分析、技术实现交流;视频和直播在B站。背景我在与开发者交流关于DDD的建模思路时,往往会遇到一个难题,就是不少经验丰富的开发者,总是带着技......
  • 反DDD模式之关系型数据库
    本文书接上回《图穷匕见-所有反DDD模式都是垃圾》,关注公众号(老肖想当外语大佬)获取信息:最新文章更新;DDD框架源码(.NET、Java双平台);加群畅聊,建模分析、技术实现交流;视频和直播在B站。背景我在与开发者交流关于DDD的建模思路时,往往会遇到一个难题,就是不少经验丰富的开发者,总是带......
  • Qt:实现单例模式
    前言记录一下。正文单例模式根据实现方式和应用场景在Qt中可以分为以下几种类型:1.懒汉式单例懒汉式单例在第一次使用时才创建实例,延迟了对象的初始化。懒汉式单例分为线程安全和线程不安全两种实现方式。线程不安全的懒汉式单例:在第一次调用getInstance()时创建......
  • 【理论篇】数据挖掘 第六章 挖掘频繁模式、关联和相关性:基本概念和方法(下)
    说明:文章为《数据挖掘:概念与技术原书第03版》的学习笔记,该书是数据挖掘领域的经典之作,想了解更多内容请参阅原著。首先祝大家中秋快乐,本文章接上篇【理论篇】数据挖掘第六章挖掘频繁模式、关联和相关性:基本概念和方法(上)思考:满足最小支持度和最小置信度的模式一定是有趣......
  • LVS三种负载均衡模式的比较
    文章目录三种模式对比三种模式对比LVS-NATLVS-DRLVS-TUN服务器操作系统可以使用任何支持TCP/IP的操作系统大多数常见的操作系统都可以使用需要支持IP隧道技术的操作系统服务器网络需要私有网络,所有真实服务器(RS)必须位于同一局域网内同样需要局域网,但RS可以使用公网......