组合模式-文件目录管理

news2024/12/23 4:40:32

什么是组合模式?

组合模式是一种结构型设计模式,它允许你将对象组合成树形结构来表现"部分-整体"的层次结构。组合模式使得客户端可以统一地对待单个对象和对象组合,从而使得系统更加灵活。

在组合模式中,有两种基本类型的对象:叶子对象和容器对象。叶子对象表示树形结构中的叶子节点,它们不再包含任何子节点。容器对象表示树形结构中的分支节点,它们可以包含叶子对象和容器对象。

在组合模式中,所有对象都实现同一个接口,客户端可以通过该接口来操作对象,而不需要知道具体是叶子对象还是容器对象。同时,容器对象中会包含一组子对象,客户端可以通过容器对象的接口来访问和操作这些子对象。

组合模式的优点

组合模式的优点包括:

  • 客户端代码可以统一地对待单个对象和对象组合,从而简化了代码。
  • 可以通过组合方式来实现对整个树形结构的操作,从而使得代码更加灵活。
  • 可以通过容器对象来动态地添加或删除叶子对象或容器对象,从而使得系统更加易于扩展。

组合模式的缺点

组合模式的缺点包括:

  • 对于叶子对象和容器对象,它们实现的方法不一样,可能会导致代码的复杂性增加。
  • 对于大型的树形结构,可能会导致系统的性能下降。

组合模式的应用场景

组合模式适用于那些需要表示部分-整体层次结构的问题,以及那些需要对整个层次结构进行操作的问题。具体的应用场景包括:

  • 文件系统中的目录和文件。
  • UI控件中的容器控件和叶子控件。
  • 图形编辑器中的图形对象和组合对象。
  • 组织机构中的部门和员工。

组合模式的实现方式

组合模式的实现方式包括:

  • 定义一个抽象的 Component 类来声明公共的操作接口。
  • 定义一个 Leaf 类来表示叶子对象,实现 Component 接口。
  • 定义一个 Composite 类来表示容器对象,实现 Component 接口,并包含一个子对象列表。
  • 在 Composite 类中实现 Component 接口的操作方法,通过递归的方式调用子对象的操作方法。

组合模式的实例代码

下面是一个使用组合模式来实现文件目录管理的示例代码,代码使用了 Java

我们首先定义一个抽象类 TreeNode,表示树中的节点,包括文件和文件夹。该类包含了一些公共方法,比如获取名称、获取大小等。

public abstract class TreeNode {
    private String name;
    private int size;

    public TreeNode(String name, int size) {
        this.name = name;
        this.size = size;
    }

    public String getName() {
        return name;
    }

    public int getSize() {
        return size;
    }

    public abstract void add(TreeNode node);

    public abstract void remove(TreeNode node);

    public abstract List<TreeNode> getChildren();

    public abstract boolean isFile();

    public void print(int level) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < level; i++) {
            sb.append("-");
        }
        System.out.println(sb.toString() + getName() + " (" + getSize() + ")");
        for (TreeNode child : getChildren()) {
            child.print(level + 1);
        }
    }
}

然后,我们定义一个 FileNode 类,表示文件。该类继承自 TreeNode 类,并实现了添加和删除节点的方法,但因为它是文件节点,所以这些方法什么也不做。

public class FileNode extends TreeNode {
    public FileNode(String name, int size) {
        super(name, size);
    }

    @Override
    public void add(TreeNode node) {
        // do nothing
    }

    @Override
    public void remove(TreeNode node) {
        // do nothing
    }

    @Override
    public List<TreeNode> getChildren() {
        return new ArrayList<>();
    }

    @Override
    public boolean isFile() {
        return true;
    }
}

接下来,我们定义一个 FolderNode 类,表示文件夹。该类也继承自 TreeNode 类,并包含了一个 List 类型的成员变量 children,用于存储子节点。

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

public class FolderNode extends TreeNode {
    private List<TreeNode> children = new ArrayList<>();

    public FolderNode(String name) {
        super(name, 0);
    }

    @Override
    public void add(TreeNode node) {
        children.add(node);
        setSize(getSize() + node.getSize());
    }

    @Override
    public void remove(TreeNode node) {
        children.remove(node);
        setSize(getSize() - node.getSize());
    }

    @Override
    public List<TreeNode> getChildren() {
        return children;
    }

    @Override
    public boolean isFile() {
        return false;
    }
}

public class Main {
    public static void main(String[] args) {
        TreeNode file1 = new FileNode("file1.txt", 10);
        TreeNode file2 = new FileNode("file2.txt", 20);
        TreeNode file3 = new FileNode("file3.txt", 30);

        TreeNode folder1 = new FolderNode("folder1");
        folder1.add(file1);
        folder1.add(file2);

        TreeNode folder2 = new FolderNode("folder2");
        folder2.add(file3);

        TreeNode root = new FolderNode("root");
        root.add

root (60)
-folder1 (30)
--file1.txt (10)
--file2.txt (20)
-folder2 (30)
--file3.txt (30)

类图

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/386743.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SQL开发管理工具,SQL Studio成数据库管理工具热门

达梦数据库冲击IPO成功&#xff1b;麒麟软件等国产Linux桌面操作系统在国防、教育等行业达到百万规模级应用&#xff1b;阿里云计算操作系统取得重大突破&#xff0c;阿里云市场份额全球第三&#xff1b;宝兰德、中创等厂商的应用服务器中间件能够实现对IBM和Oracle相关产品的替…

Linux学习第十一节-磁盘类型介绍和挂载

1.磁盘类型介绍 IDE接口类型&#xff1a;主要用于个人家用计算机领域&#xff0c;优点价格便宜&#xff0c;缺点数据传输速度慢&#xff1b; SCSI接口类型&#xff1a; 主要用于服务器领域&#xff0c;数据传输速度快&#xff0c;支持热插拔&#xff1b; SATA接口类型&…

Android Automotive 调节音量的过程

Android Automotive OS (AAOS) 是在核心 Android 系统的基础之上打造而成&#xff0c;以支持将 Android 系统用作车辆信息娱乐系统的场景。AAOS 的音频系统对核心 Android 音频系统做了扩充&#xff0c;创建了新的概念和抽象&#xff0c;如音区等&#xff0c;提供了新的 API 接…

〖大前端 - 基础入门三大核心之 html 篇⑩〗- 图片标签

大家好&#xff0c;我是 哈士奇 &#xff0c;一位工作了十年的"技术混子"&#xff0c; 致力于为开发者赋能的UP主, 目前正在运营着 TFS_CLUB社区。 &#x1f4ac; 人生格言&#xff1a;优于别人,并不高贵,真正的高贵应该是优于过去的自己。&#x1f4ac; &#x1f4e…

如何利用github搭建个人主页网站?

本章教程告诉你如何利用github搭建一个个人静态主页网站。 适合没有服务器和域名且对网站搭建感兴趣的人玩玩&#xff0c;github稳定性可能差一点。 目录 一、前期准备工作 二、 创建项目仓库 三、将网站上传到github 四、我的个人主页展示 一、前期准备工作 1、首先&#x…

[1.1_1]计算机系统概述——操作系统的概念、功能和目标

文章目录第一章 计算机系统概述操作系统的概念&#xff08;定义&#xff09;、功能和目标&#xff08;一&#xff09;操作系统的概念&#xff08;定义&#xff09;&#xff08;二&#xff09;操作系统的功能和目标1、作为系统资源的管理者2、向上层提供方便易用的服务3、作为最…

选课系统的设计与实现

技术&#xff1a;Java等摘要&#xff1a;目前国内各高校的规模越来越大&#xff0c;进而造成教师教学管理等工作量日趋加大。然而&#xff0c;现代教育的信息化、网络化已经成为教育发展的一个重要方向&#xff0c;同时也为解决高校教学管理效率低下的现状&#xff0c;使管理突…

[架构之路-126]-《软考-系统架构设计师》-操作系统-5-虚拟化技术、Docker与虚拟机比较

第1章 Docker与虚拟机比较总体概述1.1 宏观比较虚拟机和Docker容器技术都是一种虚拟化技术。虚拟机包含的是整个操作系统的原生镜像&#xff0c;非常的庞大。docker的镜像只包含最核心的环境&#xff0c;非常小巧。&#xff08;1&#xff09;比较Docker与虚拟机技术的不同&…

【CS224W】(task9)图神经网络的表示能力(更新中!!)

note 基于图同构网络&#xff08;GIN&#xff09;的图表征网络。为了得到图表征首先需要做节点表征&#xff0c;然后做图读出。GIN中节点表征的计算遵循WL Test算法中节点标签的更新方法&#xff0c;因此它的上界是WL Test算法。 在图读出中&#xff0c;我们对所有的节点表征&…

线程基础复习

线程基础复习 程序&#xff1a;一段静态的代码 进程&#xff1a;正在执行的程序,是操作系统资源分配的最小单位 线程&#xff1a;进程可进一步细分为线程,是进程内部最小的执行单元,是操作系统进行任务调度的最小单元,属于进程 线程与进程的关系 一个进程可以包含多个线程,…

Python3-循环语句

Python3 循环语句 本章节将为大家介绍 Python 循环语句的使用。 Python 中的循环语句有 for 和 while。 Python 循环语句的控制结构图如下所示&#xff1a; while 循环 Python 中 while 语句的一般形式&#xff1a; while 判断条件(condition)&#xff1a;执行语句(stat…

Mysql是怎样运行的——B+树索引

&#x1f4a5; 前章回顾&#xff1a; &#x1f4a5; 前面我们详细唠叨了InnnoDB数据页的7个组成部分&#xff0c;知道了各个数据页可以组成一个双向链表&#xff0c;而每个数据页中的记录会按照主键值从小到大的顺序组成一个单向链表&#xff0c;每个数据页都会为存储在它里边的…

构建“以客户为中心”的新型商业模式

很难想象一个ERP系统能帮助企业变得更加以客户为中心。然而&#xff0c;如果采用正确的方法&#xff0c;ERP系统确实可以帮助你的企业把客户置于其所有规划、产品开发和运营的中心。 什么是以客户为中心的业务方法&#xff1f; 以客户为中心的业务方法将客户旅程放在每个行动…

图表控件LightningChart.NET 系列教程(九):LightningChart 组件——从工具箱添加至 WPF 项目

LightningChart.NET LightningChart.NET 是一款高性能 WPF 和 Winforms 图表,可以实时可视化多达1万亿个数据点。可有效利用CPU和内存资源&#xff0c;实时监控数据流。同时&#xff0c;LightningChart使用突破性创新技术&#xff0c;以实时优化为前提&#xff0c;大大提升了实…

将字符串生成艺术字pyfiglet.figlet_format

【小白从小学Python、C、Java】【计算机等级考试500强双证书】【Python-数据分析】将字符串生成艺术字pyfiglet.figlet_format选择题以下关于python代码表述错误的一项是?import pyfigletmyText"python"print("【执行】pyfiglet.figlet_format")resultpyf…

第一篇:1.3Inch ISP Screen简介

1.简介官方连接: http://www.lcdwiki.com/zh/1.3inch_IPS_Module我在淘宝买的这款,其驱动IC是st7789,这款的分辨率是相对来说最高的,因此买的时候可能看到比他大的屏幕比这个还便宜.1.1产品介绍1.3寸IPS彩屏&#xff0c;支持 RGB 65K色显示&#xff0c;显示色彩丰富240X240分辨…

Vue2.0开发之——购物车案例-案例说明及导入Header(44)

一 概述 初始项目预览最终项目预览二 案例说明 2.1 初始项目代码结构 2.2 Components组件与项目的对应关系 对应关系&#xff1a; components/Counter&#xff1a;物品数量components/Footer&#xff1a;购物车底部components/Goods&#xff1a;购物车商品components/Header…

第二大脑应用程序Cogito

本文软件是网友 Juijote 推荐&#xff1b; 什么是 Cogito &#xff1f; 官方号称是 又一个第二大脑应用程序&#xff0c;其实就是一个普通的笔记软件&#xff0c;但既不支持块操作、也不支持双链&#xff0c;更不具备现在流行的白板交互。 先来张官方图片感受一下 安装 在群晖…

Java之反射

反射机制1. Java反射机制的概念1.1 静态&动态语言1.2 反射机制概念1.3 反射机制研究与应用1.4 反射机制的优缺点2. 理解Class类并获取Class实例2.1 Class类介绍2.2 获取Class类的实例2.3 那些类型可以有Class对象&#xff1f;3. 类的加载与CassLoader3.1 Java内存分析3.2 类…

【Azure 架构师学习笔记】-Azure Storage Account(1)-类型简介

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Storage Account】系列。 前言 大数据引起了存储革命&#xff0c; 云计算又为大容量高速存储提供了可能的方案&#xff0c;每个商业云供应商都会提供特殊的云存储。而Azure 对应的云存储则称为存储帐户(Storage accou…