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

Composite(组合)

1)意图

将对象组合成树型结构以表示“部分-整体”的层次结构。Composite 使得用户对单个对象和组合对象的使用具有一致性。

2)结构

组合模式的结构如图 7-33 所示。
在这里插入图片描述
其中:

  • Component 为组合中的对象声明接口;在适当情况下实现所有类共有接口的默认行为;声明一个接口用于访问和管理 Component 的子组件;(可选)在递归结构中定义一个接口,用于访问一个父组件,并在合适的情况下实现它。
  • Leaf在组合中表示叶结点对象,叶结点没有子结点:在组合中定义图元对象的行为。
  • Composite 定义有子组件的那些组件的行为;存储子组件;在Component 接口中实现与子组件有关的操作。
  • Client 通过 Component 接口操纵组合组件的对象。

3)适用性

Composite 模式适用于:

  • 想表示对象的部分-整体层次结构。
  • 希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

4 应用举例

示例:文件系统中的目录和文件

创建了一个简单的文件系统模型,其中Directory可以包含其他Directory或File,而File则不能包含其他元素。通过这种方式,可以很容易地构建出复杂的文件系统结构,并且客户端可以通过相同的接口操作单个文件或整个目录树。

1. Component (组件)

public abstract class FileSystemEntry {protected String name;public FileSystemEntry(String name) {this.name = name;}public abstract int getSize();public abstract void printList(String prefix);
}

在这个例子中,FileSystemEntry 类充当了组件的角色。它是所有文件系统条目的基类,无论是文件还是目录。这个类定义了一些公共的行为,比如 getSize()printList(String prefix) 方法,这些方法在所有的文件系统条目中都是通用的。

  • getSize():返回文件或目录的大小。对于文件,它直接返回文件的大小;对于目录,它需要计算所有子项的总大小。
  • printList(String prefix):打印出文件或目录的信息,以及它们在文件系统中的路径。这里的 prefix 参数是用来构建路径的,当打印一个目录时,会递归地调用其子项的 printList() 方法,从而构建出完整的路径。

2. Leaf (叶子节点 - 文件)

public class File extends FileSystemEntry {private int size;public File(String name, int size) {super(name);this.size = size;}@Overridepublic int getSize() {return size;}@Overridepublic void printList(String prefix) {System.out.println(prefix + "/" + this);}@Overridepublic String toString() {return "File (" + name + ", " + size + " bytes)";}
}

File 类是叶子节点的具体实现。它代表文件系统中的一个文件,不包含任何子节点。因此,它的 add()remove() 操作是没有意义的,所以在 File 类中不需要实现这些方法。File 类主要实现了 getSize()printList(String prefix) 方法,分别用来返回文件的大小和打印文件信息。

3. Composite (组合节点 - 目录)

import java.util.ArrayList;
import java.util.List;public class Directory extends FileSystemEntry {private List<FileSystemEntry> children = new ArrayList<>();public Directory(String name) {super(name);}public void add(FileSystemEntry entry) {children.add(entry);}public void remove(FileSystemEntry entry) {children.remove(entry);}@Overridepublic int getSize() {int totalSize = 0;for (FileSystemEntry child : children) {totalSize += child.getSize();}return totalSize;}@Overridepublic void printList(String prefix) {System.out.println(prefix + "/" + this);String newPrefix = prefix.isEmpty() ? name : prefix + "/" + name;for (FileSystemEntry child : children) {child.printList(newPrefix);}}@Overridepublic String toString() {return "Directory (" + name + ", " + getSize() + " bytes)";}
}

Directory 类是组合节点的具体实现。它代表文件系统中的一个目录,可以包含多个文件和其他目录。Directory 类中有一个 children 列表,用于存储目录下的所有子节点。

  • add(FileSystemEntry entry):向目录中添加一个新的子节点。
  • remove(FileSystemEntry entry):从目录中移除一个子节点。
  • getSize():遍历 children 列表,累加每个子节点的大小,最终返回目录的总大小。
  • printList(String prefix):首先打印当前目录的信息,然后递归地调用每个子节点的 printList(String prefix) 方法,构建并打印出子节点的完整路径。

4. Client (客户端)

public class Client {public static void main(String[] args) {// 创建文件和目录File file1 = new File("file1.txt", 1024);File file2 = new File("file2.txt", 2048);Directory dir1 = new Directory("dir1");Directory dir2 = new Directory("dir2");// 添加文件到目录dir1.add(file1);dir1.add(file2);dir2.add(dir1);// 打印目录结构dir2.printList("");}
}

Client 类的 main 方法中,我们创建了几个文件和目录,并将它们组织成一个树形结构。通过调用 printList("") 方法,我们可以看到整个文件系统的结构和每个文件或目录的大小。
这段代码创建了一个简单的文件系统模型,其中Directory可以包含其他DirectoryFile,而File则不能包含其他元素。通过这种方式,可以很容易地构建出复杂的文件系统结构,并且客户端可以通过相同的接口操作单个文件或整个目录树。

运行结果

假设我们运行上面的客户端代码,输出可能如下所示:

/Directory (dir2, 3072 bytes)
/dir2/Directory (dir1, 3072 bytes)
/dir2/dir1/File (file1.txt, 1024 bytes)
/dir2/dir1/File (file2.txt, 2048 bytes)

这表明:

  • dir2 是最外层的目录,总大小为 3072 字节。
  • dir2 下有一个子目录 dir1dir1 的总大小也是 3072 字节。
  • dir1 包含两个文件 file1.txtfile2.txt,大小分别为 1024 字节和 2048 字节。

组合模式的关键在于它可以让你以一致的方式处理单个对象和对象的组合。这意味着你可以用相同的方式来操作文件和目录,而不需要关心它们是单个文件还是包含多个子项的目录。这种设计模式在处理具有层次结构的数据时非常有用,例如文件系统、图形用户界面的组件树等。

相关文章:

Composite(组合)

1)意图 将对象组合成树型结构以表示“部分-整体”的层次结构。Composite 使得用户对单个对象和组合对象的使用具有一致性。 2)结构 组合模式的结构如图 7-33 所示。 其中: Component 为组合中的对象声明接口;在适当情况下实现所有类共有接口的默认行为;声明一个接口用于访问…...

有Bootloader,为什么还要BROM?

有Bootloader&#xff0c;为什么还要BROM? 不少硬件平台都提供类似Boot ROM或者PBL(高通平台)固化的一段程序&#xff0c;出厂后用户一定不能修改。BROM可以引导Bootloader程序。大家知道&#xff0c;每个可启动的平台都会在存储设备&#xff0c;例如EMMC/NAND/UFS保存Bootloa…...

【MATLAB代码】CV和CA模型组成的IMM(滤波方式为UKF),可复制粘贴源代码

该MATLAB代码实现了基于无迹卡尔曼滤波器(UKF)的交互式多模型(IMM)滤波算法,旨在跟踪目标在不同运动模式(匀速直线运动CV和匀速圆周运动CT)的位置和速度。订阅专栏后,直接复制粘贴代码到MATLAB空脚本中,即可运行 文章目录 运行结果源代码程序介绍1. 初始化和参数设定2…...

【网络】传输层协议TCP(下)

目录 四次挥手状态变化 流量控制 PSH标记位 URG标记位 滑动窗口 快重传 拥塞控制 延迟应答 mtu TCP异常情况 四次挥手状态变化 之前我们讲了四次挥手的具体过程以及为什么要进行四次挥手&#xff0c;下面是四次挥手的状态变化 那么我们下面可以来验证一下CLOSE_WAIT这…...

服务器数据恢复—EVA存储故障导致上层应用不可用的数据恢复案例

服务器存储数据恢复环境&#xff1a; 一台EVA某型号控制器EVA扩展柜FC磁盘。 服务器存储故障&检测&#xff1a; 磁盘故障导致该EVA存储中LUN不可用&#xff0c;导致上层应用无法正常使用。 服务器存储数据恢复过程&#xff1a; 1、将所有磁盘做好标记后从扩展柜中取出。硬…...

支持向量机相关证明 解的稀疏性

主要涉及拉格朗日乘子法&#xff0c;对偶问题求解...

静态ip和动态ip适合什么场景

静态住宅ip由于他的ip位置保持不变的&#xff0c;更加适合&#xff1a; 1、账号管理。 使用静态住宅来注册和管理社交媒体账号&#xff0c;例如facebook、领英等&#xff0c;包括电商类的账号也是可以的&#xff0c;例如亚马逊等 2、网站测试 很多网站会检测使用者是否为机器…...

Istio Gateway发布服务

1. Istio Gateway发布服务 在集群中部署一个 tomcat 应用程序。然后将部署一个 Gateway 资源和一个与 Gateway 绑定的 VirtualService&#xff0c;以便在外部 IP 地址上公开该应用程序。 1.1 部署 Gateway 资源 vim ingressgateway.yaml --- apiVersion: networking.istio.…...

前端vue3若依框架pnpm run dev启动报错

今天前端vue3若依框架pnpm run dev启动报错信息&#xff1a; > ruoyi3.8.8 dev D:\AYunShe\2024-11-6【无锡出门证】\wuxi-exit-permit-web > vite error when starting dev server: Error: listen EACCES: permission denied 0.0.0.0:80 at Server.setupListenHand…...

python线条爱心

效果图 代码 import math from turtle import * def hearta(k):return 15*math.sin(k)**3 def heartb(k):return 12*math.cos(k)-5*\math.cos(2*k)-2*\math.cos(3*k)-\math.cos(4*k) speed(1000) bgcolor("black") for i in range(6000):goto(hearta(i)*20,heartb(…...

GPU的内存是什么?

GPU&#xff08;图形处理器&#xff09;的内存是指专门用于 GPU 存储数据的内存&#xff0c;也被称为显存。 一、显存的作用&#xff1a; 1、存储图像数据 当计算机要显示图像时&#xff0c;显存会存储屏幕上每个像素点的颜色、亮度等信息。例如&#xff0c;对于一个分辨率为 1…...

Linux - 弯路系列1:xshell能够连接上linux,但xftp连不上(子账号可以连接,但不能上传数据)

问题如题目阐述。 注&#xff1a;所有操作在root账户下操作。 解决办法&#xff1a; 1、确认连接设置 服务器地址和端口&#xff1a;确保在 Xftp 中输入的服务器地址和端口号与 Xshell 使用的相同。默认情况下&#xff0c;SFTP 使用端口 22。 用户凭证&#xff1a;检查用户名…...

数组逆序重存放

题目描述 将一个数组中的值按逆序重新存放。例如&#xff0c;原来的顺序为8,6,5,4,1。要求改为1,4,5,6,8。 输入 输入为两行&#xff1a;第一行数组中元素的个数n&#xff08;1<n<100)&#xff0c;第二行是n个整数&#xff0c;每两个整数之间用空格分隔。 输出 输出…...

归并排序:高效算法的深度解析

一、归并排序概述 归并排序是一种基于分治思想的经典排序算法。它的核心操作分为三个主要步骤&#xff1a;分割、排序和合并。 首先是分割步骤&#xff0c;将待排序的数组不断地分成更小的子数组&#xff0c;直到每个子数组中只有一个元素。例如&#xff0c;对于一个包含多个…...

微服务中常用分布式锁原理及执行流程

1.什么是分布式锁 分布式锁是一种在分布式系统环境下实现的锁机制&#xff0c;它主要用于解决&#xff0c;多个分布式节点之间对共享资源的互斥访问问题&#xff0c;确保在分布式系统中&#xff0c;即使存在有多个不同节点上的进程或线程&#xff0c;同一时刻也只有一个节点可…...

声学气膜馆助力企业年会与研学活动完美呈现—轻空间

在现代企业和教育活动中&#xff0c;场地的选择往往决定了活动的成败。尤其是在企业年会、研学基地等重要场合&#xff0c;选择一个既能满足多功能需求又能快速搭建的场地至关重要。而声学气膜馆正是为这种需求量身打造的理想场所。凭借其独特的声学性能和灵活的结构设计&#…...

Halcon3D image_points_to_world_plane详解

分三个部分来聊聊这个算子 一,算子的参数介绍 二,算法的计算过程 三,举例实现 第一部分,算子的介绍 image_points_to_world_plane( : : CameraParam, WorldPose, Rows, Cols, Scale : X, Y) 参数介绍: CameraParam,:相机内参 WorldPose 世界坐标系,也叫物体坐标系(成…...

A Consistent Dual-MRC Framework for Emotion-cause Pair Extraction——论文阅读笔记

前言 这是我第一次向同学院同年级的学生和老师们汇报的第一篇论文,于2022年发表在TOIS上,属于CCF A类,主要内容是将MRC应用到情感原因对抽取中。 论文链接:用于情绪-原因对提取的一致双 MRC 框架 |信息系统上的 ACM Transactions 这里我就不放上我自己翻译的中文版还有我…...

如何debug(Eclipse)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 2分钟教会你如何Java中DeBug【IDEA中Java】 在eclipse中如何使用Debug进行调试 双击左侧打断点(取消断点同样双击) 右上角进入debug界面(常用) 选择所需断点位置(勾选右侧需要测试的断点位置) 启动…...

【comfyui教程】ComfyUI有趣工作流推荐:快速换脸,创意随手掌握!

前言 在数字影像处理和创意表达领域&#xff0c;ComfyUI 绝对是你的得力助手&#xff01;今天我们推荐一个非常有趣的工作流——快速换脸。无论你是图像编辑小白&#xff0c;还是深耕AI影像的达人&#xff0c;这个工作流都能让你快速实现面部迁移&#xff0c;体验全新的照片玩…...

css-flex布局属性

flex 布局的优势 flex 布局的子元素不会脱离文档流flex 是一种现代的布局方式&#xff0c;是 W3C 第一次提供真正用于布局的 CSS 规范 弹性盒子、子元素 弹性盒子&#xff1a;指的是使用 display:flex 或 display:inline-flex 声明的父容器 声明&#xff1a;使用 display:fl…...

【鸿蒙】HarmonyOS NEXT应用开发快速入门教程之布局篇(下)

系列文章目录 【鸿蒙】HarmonyOS NEXT开发快速入门教程之ArkTS语法装饰器&#xff08;上&#xff09; 【鸿蒙】HarmonyOS NEXT开发快速入门教程之ArkTS语法装饰器&#xff08;下&#xff09; 【鸿蒙】HarmonyOS NEXT应用开发快速入门教程之布局篇&#xff08;上&#xff09; 【…...

高阶函数--python

高阶函数应当满足至少下面一个条件&#xff1a; 接受一个或多个函数参数 输出一个函数 下面用一个例子来理解高阶函数。 一、高阶函数 先看一个简单的函数 例一&#xff1a; 例二&#xff1a; 是高阶函数&#xff0c;因为满足条件&#xff0c;返回一个函数 并且有闭包&a…...

MYSQL备库的并行复制

备库在消费中转日志时&#xff0c;其实可以分多个线程同时对多个事务进行消费&#xff0c;但是要满足2个基本原则&#xff1a; 1.涉及同一行数据的多个事务必须在同一个线程中执行&#xff0c;否则会导致数据不一致 2.同一个事务不能被拆开 MYSQL 5.6的并行复制策略&#xff…...

体感游戏开发:参考资料

体感游戏开发是一个涉及多个领域知识和技能的过程&#xff0c;以下是一些参考资料和建议&#xff0c;以帮助开发者更好地进行体感游戏开发&#xff1a; 一、技术文档和指南 游戏开发引擎文档 Unity、Unreal Engine等主流游戏开发引擎提供了详细的文档和教程&#xff0c;涵盖从…...

Diving into the STM32 HAL-----Clock Tree笔记

几乎每个数字电路都需要一种方法来同步其内部电路或与其他电路同步。时钟是一种产生周期性信号的设备&#xff0c;它是数字电子学中最普遍的心跳源形式。 然而&#xff0c;相同的时钟信号不能用于馈送现代微控制器&#xff08;如 STM32 微控制器&#xff09;提供的所有组件和外…...

【AIGC】如何充分利用ChatGPT:有效提示框架与基本规则

概述 在使用ChatGPT进行内容创作时&#xff0c;遵循结构化的提示框架和基本规则可以显著提升AI响应的质量。本文探讨了五种结构化的提示框架&#xff0c;并详细介绍了基本规则和进阶技巧&#xff0c;帮助您更有效地与ChatGPT互动。 基础规则 规则1&#xff1a;指令放在开头&…...

【1个月速成Java】基于Android平台开发个人记账app学习日记——第7天,申请阿里云SMS短信服务SDK

系列专栏链接如下&#xff0c;方便跟进&#xff1a; https://blog.csdn.net/weixin_62588253/category_12821860.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12821860&sharereferPC&sharesourceweixin_62588253&sharefromfrom_link 同时篇幅…...

视频怎么去除杂音保留人声?教你如何实现视频降噪

在视频录制的过程中&#xff0c;可能会产生很多杂音和噪音&#xff0c;这可能时因为录制环境不理想、录制设备故障等多方面造成的。视频怎么去除杂音保留人声&#xff1f;今天我们就来谈谈如何实现视频降噪。 视频中常见的杂音类型 自然环境音&#xff1a;如风声、水流声、鸟叫…...

数学建模学习(136):使用Python基于Fuzzy WSM、Fuzzy WPM、Fuzzy WASPAS的多准则决策分析

1. 算法介绍 1.1 Fuzzy WSM、Fuzzy WPM、Fuzzy WASPAS 的基本概念和背景 模糊多属性决策(MADM)方法是解决复杂决策问题的重要工具,尤其是在信息不确定且难以量化的情况下。Fuzzy WSM(Fuzzy Weighted Sum Model)、Fuzzy WPM(Fuzzy Weighted Product Model)、以及 Fuzzy…...