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

结构性设计模式之Composite(组合)

结构性设计模式之Composite(组合)

摘要:
Composite(组合)模式通过树形结构表示"部分-整体"层次关系,使得用户能够统一处理单个对象和组合对象。该模式包含Component(组件接口)、Leaf(叶子节点)和Composite(组合节点)三个核心角色,适用于需要表示对象层次结构并统一操作的场景。示例代码展示了文件夹结构的实现,Folder类管理子组件,File类作为叶子节点,通过递归遍历实现统一处理。该模式简化了客户端代码,使系统更易扩展和维护。

1)意图;

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

2)结构

在这里插入图片描述

其中:

  • Componect 为组合中的对象声明接口:在适当情况下实现所有类共有接口的默认行为:

    声明一个接口用户访问和管理 Componect的子组件;(可选)在递归结构中定义一个

    接口,用于访问一个父组件,并在合适的情况下实现它。

  • Leaf 在组合中表示叶节点对象,叶结点没有子节点节点;在组合中定义图元对象的行为。

  • Composite定义有子组件的那些组件的行为;存储子组件;在Component接口中实现与子组件有关的操作。

  • Client 通过 Component 接口操纵组合组件的对象。

3)适用性

Composite 模式下适用于:

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

代码

import java.util.ArrayList;
import java.util.List;/*** @author psd 结构性设计模式之组合设计模式*/
public class ComponentDemo {public static void main(String[] args) {AbstractFile root = new Folder("root");AbstractFile folderA = new Folder("folderA");AbstractFile folderB = new Folder("folderB");AbstractFile fileC = new File("fileC");AbstractFile fileD = new File("fileD");AbstractFile fileE = new File("fileE");root.add(folderA);root.add(folderB);root.add(fileC);folderA.add(fileD);folderA.add(fileE);print(root);}private static void print(AbstractFile file) {file.printName();List<AbstractFile> childrenList = file.getChildren();if (childrenList == null) {return;}for (AbstractFile children : childrenList) {print(children);}}
}abstract class AbstractFile {protected String name;public void printName() {System.out.println(name);}public abstract boolean add(AbstractFile file);public abstract boolean remove(AbstractFile file);public abstract List<AbstractFile> getChildren();
}/*** 文件夹*/
class Folder extends AbstractFile {public Folder(String name) {this.name = name;}List<AbstractFile> children = new ArrayList<>();@Overridepublic boolean add(AbstractFile file) {return children.add(file);}@Overridepublic boolean remove(AbstractFile file) {return children.remove(file);}@Overridepublic List<AbstractFile> getChildren() {return children;}
}class File extends AbstractFile {public File(String name) {this.name = name;}@Overridepublic boolean add(AbstractFile file) {return false;}@Overridepublic boolean remove(AbstractFile file) {return false;}@Overridepublic List<AbstractFile> getChildren() {return null;}}

代码目录结构如下:

在这里插入图片描述
欢我的文章记得点个在看,或者点赞,持续更新中ing…

http://www.lryc.cn/news/2398727.html

相关文章:

  • Java面试八股--04-MySQL
  • 日语学习-日语知识点小记-构建基础-JLPT-N4阶段(31):そう
  • 设计模式——访问者设计模式(行为型)
  • 实验设计与分析(第6版,Montgomery著,傅珏生译) 第10章拟合回归模型10.9节思考题10.1 R语言解题
  • 《对象创建的秘密:Java 内存布局、逃逸分析与 TLAB 优化详解》
  • LeetCode 高频 SQL 50 题(基础版) 之 【高级查询和连接】· 下
  • Java并发编程:读写锁与普通互斥锁的深度对比
  • Spring Boot Actuator未授权访问漏洞修复
  • 机器学习——SVM
  • 【音视频】FFmpeg 硬件(NVDIA)编码H264
  • 贪心算法应用:超图匹配问题详解
  • OpenCV CUDA模块结构分析与形状描述符------计算指定阶数的矩(Moments)所需的总数量函数:numMoments
  • 【Web应用】若依框架:基础篇13 源码阅读-前端代码分析
  • [java八股文][JavaSpring面试篇]SpringCloud
  • 深度学习篇---face-recognition的优劣点
  • 基于分布式状态机的集装箱智能道口软件架构方法
  • Oracle的Hint
  • 手动事务的使用
  • Vue 树状结构控件
  • Spring Boot的启动流程,以及各个扩展点的执行顺序
  • 【LUT技术专题】图像自适应3DLUT代码讲解
  • Apache Doris 在数据仓库中的作用与应用实践
  • vscode使用“EIDE”和“Cortex-Debug”插件利用st-link插件实现程序烧写以及调试工作
  • Spring @Value注解的依赖注入实现原理
  • 三、kafka消费的全流程
  • 商品模块中的多规格设计:实现方式与电商/ERP系统的架构对比
  • (三)动手学线性神经网络:从数学原理到代码实现
  • Axure形状类组件图标库(共8套)
  • 20250530-C#知识:String与StringBuilder
  • 从 Docker 到 Containerd:Kubernetes 容器运行时迁移实战指南