组合模式(Composite)

server/2024/9/25 8:32:38/

组合模式(Composite)

文章目录

什么是组合模式

组合模式(Composite),将对象组合成树形结构以表示部分-整体的层次结构。组合模式使得用户对单个对象和组合对象
的使用具有一致性

  • Component:组合中的对象声明接口,在适当情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理Component的子部件
  • Leaf:在组合中表示叶节点对象,叶节点没有子节点
  • Composite:定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关的操作,比如增加Add和删除Remove

通过示例了解组合模式

组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构,然后以统一的方式处理单个对象和组合对象。这样,客户端代码可以一致地处理个体对象和组合对象,无需知道处理的是单个对象还是组合对象。组合模式使得你能够构建复杂的、部分-整体层次结构,同时保持对对象的独立操作。

以下是一个使用Java实现的组合模式示例,我们将创建一个文件系统模型,包括文件(File)和目录(Directory)两种类型,它们共同实现了FileSystemComponent接口。

1.FileSystemComponent(组件)接口

public interface FileSystemComponent {String getName();void printContents(int indent);void add(FileSystemComponent component);void remove(FileSystemComponent component);
}

2.File(叶节点)类

public class File implements FileSystemComponent {private String name;// 内容private String content;public File(String name, String content) {this.name = name;this.content = content;}@Overridepublic String getName() {return name;}@Overridepublic void printContents(int indent) {for (int i = 0; i < indent; i++) {System.out.print("\t");}System.out.println(name + " (File): " + content);}// 文件无法添加或删除子组件,因此实现为空方法@Overridepublic void add(FileSystemComponent component) {}@Overridepublic void remove(FileSystemComponent component) {}
}

3.Directory(容器节点)类

import java.util.ArrayList;
import java.util.List;public class Directory implements FileSystemComponent {private String name;private List<FileSystemComponent> children;public Directory(String name) {this.name = name;this.children = new ArrayList<>();}@Overridepublic String getName() {return name;}@Overridepublic void printContents(int indent) {for (int i = 0; i < indent; i++) {System.out.print("\t");}System.out.println(name + " (Directory)");for (FileSystemComponent child : children) {child.printContents(indent + 1);}}@Overridepublic void add(FileSystemComponent component) {children.add(component);}@Overridepublic void remove(FileSystemComponent component) {children.remove(component);}
}

4.使用示例

public class Main {public static void main(String[] args) {Directory root = new Directory("root");Directory documents = new Directory("Documents");Directory pictures = new Directory("Pictures");File readme = new File("README.txt", "This is the root directory.");File doc1 = new File("doc1.txt", "Document 1 content");File pic1 = new File("pic1.jpg", "Picture 1 description");root.add(documents);root.add(pictures);documents.add(readme);documents.add(doc1);pictures.add(pic1);System.out.println("File system structure:");root.printContents(0);}
}

组合模式的核心思想和优点如下:

  1. 部分-整体层次结构:组合模式创建了一个包含个体对象(叶节点)和组合对象(容器节点)的树形结构。在这个结构中,每个对象都有相同的接口,客户端可以通过这个接口对单个对象和组合对象进行一致的操作。
  2. 透明操作:客户端无需关心操作的对象是单个元素还是整个组合。例如,在上述示例中,无论是打印单个文件的内容,还是打印整个目录及其包含的所有子文件和子目录的内容,都只需调用printContents()方法。
  3. 递归遍历:组合对象通过递归调用其子组件的相应方法来处理请求。例如,当打印目录时,会递归地调用其所有子文件和子目录的printContents()方法。
  4. 易于扩展和修改:由于客户端代码与对象的结构解耦,你可以轻松地在树状结构中添加新的组件或调整现有结构,而不会影响客户端代码。
  5. 封装复杂性:组合模式隐藏了对象树的内部结构和复杂性,客户端只需要与FileSystemComponent接口交互,无需了解具体的实现细节。

综上所述,组合模式在处理具有部分-整体关系的层次结构时非常有用,它提供了一种灵活的方式来处理单个对象和组合对象,简化了客户端代码,同时也便于扩展和维护复杂的对象结构。


http://www.ppmy.cn/server/20250.html

相关文章

Keras中model.predict()与model()的区别

文章目录 一、函数详解1.1、keras_model.predict(x)1.2、keras_model(x) 二、加速测试2.1、model.predict(xinput_data) —— 时耗&#xff1a;0.09967 秒2.2、model.predict(xinput_data, batch_size8) —— 时耗&#xff1a;0.12919 秒2.3、model.predict(tf.data.Dataset.fr…

手撕netty源码(一)- NioEventLoopGroup

文章目录 前言一、NIO 与 netty二、NioEventLoopGroup 对象的创建过程2.1 创建流程图2.2 EventExecutorChooser 的创建 前言 processOn文档跳转 本文是手撕netty源码系列的开篇文章&#xff0c;会先介绍一下netty对NIO关键代码的封装位置&#xff0c;主要介绍 NioEventLoopGro…

深入剖析图像平滑与噪声滤波

噪声 在数字图像处理中&#xff0c;噪声是指在图像中引入的不希望的随机或无意义的信号。它是由于图像采集、传输、存储或处理过程中的各种因素引起的。 噪声会导致图像质量下降&#xff0c;使图像失真或降低细节的清晰度。它通常表现为图像中随机分布的亮度或颜色变化&#…

TypeScript入门第一天,所有类型+基础用法+接口使用

表示逻辑值&#xff1a;true 和 false。在JavaScript和TypeScript里叫做boolean | | 数组类型 | 无 | 声明变量为数组。 // 在元素类型后面加上[] let arr: number[] [1, 2]; // 或者使用数组泛型&#xff0c;Array<元素类型> let arr: Array [1, 2]; | | 元组…

MySQL__索引

文章目录 &#x1f60a; 作者&#xff1a;Lion J &#x1f496; 主页&#xff1a; https://blog.csdn.net/weixin_69252724 &#x1f389; 主题&#xff1a; MySQL__索引&#xff09; ⏱️ 创作时间&#xff1a;2024年04月23日 ———————————————— 这里写目…

SpringBoot学习之SpringBoot3集成OpenApi(三十八)

Springboot升级到Springboot3以后,就彻底放弃了对之前swagger的支持,转而重新支持最新的OpenApi,今天我们通过一个实例初步看看OpenApi和Swagger之间的区别. 一、POM依赖 我的POM文件如下,仅作参考: <?xml version="1.0" encoding="UTF-8"?>…

盲人咖啡厅导航:科技之光点亮独立生活新里程

在这个繁华的世界中&#xff0c;咖啡厅不仅是人们社交聚会、休闲阅读的场所&#xff0c;更是无数人心灵栖息的一方天地。然而&#xff0c;对于视障群体而言&#xff0c;独自前往这样的公共场所往往面临重重挑战。幸运的是&#xff0c;一款名为蝙蝠避障专为盲人设计的辅助应用&a…

把私有数据接入 LLMs:应用程序轻松集成 | 开源日报 No.236

run-llama/llama_index Stars: 29.9k License: MIT llama_index 是用于 LLM 应用程序的数据框架。 该项目解决了如何最佳地利用私有数据增强 LLMs&#xff0c;并提供以下工具&#xff1a; 提供数据连接器&#xff0c;以摄取现有的数据源和各种格式&#xff08;API、PDF、文档…