结构型模式 - 组合模式 (Composite Pattern)

news/2025/2/27 22:55:16/

结构型模式 - 组合模式 (Composite Pattern)

组合模式是一种结构型设计模式,它允许你将对象组合成树形结构以表示 “部分 - 整体” 的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。


经典的例子就是树形结构,里面可以是文件和文件夹的组合,文件夹还可以再往下组合文件夹和文件.

// 抽象组件类,定义文件和文件夹的公共操作
abstract class FileSystemComponent {protected String name;public FileSystemComponent(String name) {this.name = name;}// 获取组件名称public String getName() {return name;}// 显示组件信息,具体实现由子类完成public abstract void display();// 以下方法在叶子节点(文件)中不做实际操作,在组合节点(文件夹)中实现public void add(FileSystemComponent component) {throw new UnsupportedOperationException("不支持该操作");  // 默认抛出异常, 只有文件夹类型的去重写就行}public void remove(FileSystemComponent component) {throw new UnsupportedOperationException("不支持该操作");}public FileSystemComponent getChild(int index) {throw new UnsupportedOperationException("不支持该操作");}
}
// 叶子节点类,代表文件
class File extends FileSystemComponent {public File(String name) {super(name);}// 显示文件信息@Overridepublic void display() {System.out.println("文件: " + getName());}
}
import java.util.ArrayList;
import java.util.List;// 组合节点类,代表文件夹
class Folder extends FileSystemComponent {private List<FileSystemComponent> children = new ArrayList<>();public Folder(String name) {super(name);}// 显示文件夹及其子组件信息@Overridepublic void display() {System.out.println("文件夹: " + getName());for (FileSystemComponent component : children) {System.out.print("  ");component.display();}}// 添加子组件@Overridepublic void add(FileSystemComponent component) {children.add(component);}// 移除子组件@Overridepublic void remove(FileSystemComponent component) {children.remove(component);}// 获取指定索引的子组件@Overridepublic FileSystemComponent getChild(int index) {return children.get(index);}
}

父类默认给 add, remove, getChild 抛出异常, 文件夹类重写父类 add, remove, getChild, 来达到文件夹类有这些方法, 而文件类没有.

这种编码形式可以借鉴, 可以在一定程度上规避一些问题.


http://www.ppmy.cn/news/1575358.html

相关文章

《TransMamba:一种混合Transformer-Mamba网络用于单图像去雨》学习笔记

paper&#xff1a;2409.00410 GitHub&#xff1a;sunshangquan/TransMamba 目录 摘要 1、介绍 2、相关工作 2.1 单图像去雨 2.2 视觉Transformer 2.3 光谱域中的Transformer 2.4 光谱域中的图像恢复 2.5 视觉Mamba 3、方法 3.1 整体网络架构 3.2 光谱域变换块&am…

Failed to start The PHP FastCGI Process Manager.

报错如下&#xff1a; Job for php-fpm.service failed because the control process exited with error code. See "systemctl status php-fpm.service" and "journalctl -xe" for details. 2月 25 21:49:00 nginx systemd[1]: Starting The PHP FastC…

Java注解的原理

目录 问题: 作用&#xff1a; 原理&#xff1a; 注解的限制 拓展&#xff1a; 问题: 今天刷面经&#xff0c;发现自己不懂注解的原理&#xff0c;特此记录。 作用&#xff1a; 注解的作用主要是给编译器看的&#xff0c;让它帮忙生成一些代码&#xff0c;或者是帮忙检查…

进程令牌:Windows 安全架构中的关键元素

一、进程令牌概述 进程令牌&#xff08;Process Token&#xff09;是 Windows 操作系统中一个重要的安全机制&#xff0c;它包含了与进程安全上下文相关的详细信息。每个进程在执行时都会关联一个进程令牌&#xff0c;令牌用于确定该进程可以访问哪些资源以及能执行哪些操作。…

kotlin 知识点四 高阶函数详解 什么是内联函数

定义高阶函数 Kotlin 的标准函数&#xff0c;如run、apply函数 这几个函数有一个共同的特点&#xff1a;它们都会要求我们传入一个Lambda 表达式作 为参数。像这种接收Lambda 参数的函数就可以称为具有函数式编程风格的API&#xff0c;而如果你想要 定义自己的函数式API&#…

防火墙各项指标代表什么意思

防火墙常见指标配置及其含义解析 1. 源地址对象&#xff08;Source Address&#xff09; 含义&#xff1a;流量的来源IP地址或IP地址范围。作用&#xff1a;定义哪些IP地址或网络段的流量可以被允许或拒绝。示例&#xff1a; 单个IP&#xff1a;192.168.1.1IP范围&#xff1a;…

SQLite 安装教程以及可视化工具介绍

目录 简述 1. Windows 系统安装 1.1 下载预编译的二进制文件 1.2 解压文件 1.3 配置环境变量 1.4 验证安装 2. GUI 可视化工具 2.1 免费工具 2.1.1 DB Browser for SQLite 2.1.2 SQLiteStudio 2.1.3 SQLite Expert 2.1.4 SQLiteGUI 2.1.5 Antares SQL 2.1.6 DbGa…

从零到一学习c++(基础篇--筑基期十一-类)

从零到一学习C&#xff08;基础篇&#xff09; 作者&#xff1a;羡鱼肘子 温馨提示1&#xff1a;本篇是记录我的学习经历&#xff0c;会有不少片面的认知&#xff0c;万分期待您的指正。 温馨提示2&#xff1a;本篇会尽量用更加通俗的语言介绍c的基础&#xff0c;用通俗的语言去…