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

【设计模式】文件目录管理是组合模式吗?

组合模式是什么?

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

img

组合模式在什么情况下使用?

当你发现你需要在代码中实现树形数据结构,让整体-部分关系更清晰,或需要希望用户对单个对象和组合对象有一致的访问方式时,组合模式就会非常有用。

如何在Java中实现组合模式?

让我们进入一个我们都熟悉的场景——**使用计算机操作文件和文件夹。**在这个场景中,文件和文件夹都可以被看作是文件系统的一部分,它们有许多共同的操作,比如打开、移动、删除等。让我们看看如何使用组合模式来简化这样的系统。

首先,我们定义一个顶层的抽象类 FileSystemComponent:

public abstract class FileSystemComponent {protected String name;public FileSystemComponent(String name) {this.name = name;}public abstract void open();public abstract void move();public abstract void delete();// 如果需要,也可以添加add()和remove()方法来管理子组件
}

然后,我们创建两个子类,分别代表文件(File)和文件夹(Directory):

public class File extends FileSystemComponent {public File(String name) {super(name);}public void open() {// 实现文件打开的逻辑}public void move() {// 实现文件移动的逻辑}public void delete() {// 实现文件删除的逻辑}
}public class Directory extends FileSystemComponent {private List<FileSystemComponent> components = new ArrayList<>();public Directory(String name) {super(name);}public void add(FileSystemComponent component) {components.add(component);}public void remove(FileSystemComponent component) {components.remove(component);}public void open() {// 实现文件夹打开的逻辑,如打开里面的所有文件和文件夹}public void move() {// 实现文件夹移动的逻辑}public void delete() {// 实现文件夹删除的逻辑,包括删除里面的所有文件和文件夹}
}

在这个设计中,FileDirectory都是FileSystemComponent,都具有公共的方法。对于用户来说,不论是操作文件,还是操作文件夹,其方式都是一致的。

另一个例子-图形绘制应用

继续我们对组合模式的探讨,让我们通过一个绘制图形的实例来进一步理解组合模式的应用。

设想你在开发一个图形绘制的应用,你需要在图纸上绘制出各种简单和复杂的图形,其中复杂的图形可能是由一系列较小的图形组成的。在这种场景下,无论是简单的圆,还是由多个形状组成的复杂图形,都可以被视为绘图应用中的一个"图形"。

首先,我们定义一个代表"图形"的顶层接口:

public interface Graphic {void move(int x, int y);void draw();
}

然后,实现一个简单的基本元素,如 “Circle”:

public class Circle implements Graphic {private int x, y;public void move(int x, int y) {this.x = x;this.y = y;// 实现移动逻辑...}public void draw() {// 实现绘制逻辑...}
}

为了使组合图形能够管理简单图形,我们可以创建一个"ComplexGraphic"类,同样实现"Graphic"接口:

public class ComplexGraphic implements Graphic {private List<Graphic> children = new ArrayList<>();public void add(Graphic graphic) {children.add(graphic);}public void remove(Graphic graphic) {children.remove(graphic);}public void move(int x, int y) {for (Graphic child : children) {child.move(x, y);}}public void draw() {for (Graphic child : children) {child.draw();}}
}

在使用过程中,客户端代码无需关心Graphic接口的具体实现,它可以一致地对待所有的图形,无论是简单图形还是复杂图形:

Circle circle1 = new Circle();
circle1.move(1, 1);
circle1.draw();Circle circle2 = new Circle();
circle2.move(2, 2);
circle2.draw();ComplexGraphic complex = new ComplexGraphic();
complex.add(circle1);
complex.add(circle2);
complex.draw();

我们可以看到,通过组合模式,客户端代码可以以一致的方式处理单个对象和组合的对象,大大简化了代码的复杂性。希望这篇博客能让你对组合模式有更深入的理解。

总结,组合模式提供了一种优秀的机制,用于表达和管理整体以及部分之间的关系,编写出来的代码不仅清晰有序,也更加符合开闭原则。

相关文章:

【设计模式】文件目录管理是组合模式吗?

组合模式是什么&#xff1f; 组合模式是一种将对象组合成树形结构以表示"部分-整体"的层次结构的设计模式。它使得用户对单个对象和组合对象的使用具有一致性。 组合模式在什么情况下使用&#xff1f; 当你发现你需要在代码中实现树形数据结构&#xff0c;让整体-部…...

利用appium自动控制移动设备并提取数据

安装appium-python-client模块并启动已安装好的环境 安装appium-python-client模块 在window的虚拟环境下执行pip install appium-python-client 启动夜神模拟器&#xff0c;进入夜神模拟器所在的安装路径的bin目录下&#xff0c;进入cmd终端&#xff0c;使用adb命令建立adb…...

day22_236二叉树最近公共祖先_235二叉搜索树(最近公共祖先_701插入一个节点_450删除一个节点)

文章目录 [236 二叉树的最近公共祖先](https://programmercarl.com/0236.%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E6%9C%80%E8%BF%91%E5%85%AC%E5%85%B1%E7%A5%96%E5%85%88.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE)[235 二叉搜索树的最近公共祖先](https://program…...

OpenSource - 工具管理器easy-manager-tool

文章目录 功能说明运行配置环境配置启动docker部署 项目安全UI展示 Easy-Manager-Tool 打造软件行业首款集成工具&#xff0c;不管你是程序员&#xff0c;测试&#xff0c;运维等都可以使用该软件来提升自己的工作效率。 Easy-Manager-Tool 的诞生是为了解决软件行业众多参与者…...

Laravel7 + easyWeChat 实现微信公众号支付功能

注册服务号&#xff0c;需进行微信认证&#xff0c;此时需缴费 300 元/年&#xff0c;必须是认证成功的服务号才能开通微信支付。 注册微信支付商户号 1、登录 https://pay.weixin.qq.com/index.php/core/home/login?return_urlhttps%3A%2F%2Fpay.weixin.qq.com%2Findex.php%…...

Linux环境下,针对QT软件工程搭建C++Test单元测试环境的操作指南

文章目录 前言一、安装QT二、安装CTest三、使用QT生成.bdf文件四、创建CTest工程注意事项 前言 CTest是Parasoft公司出品的一款可以针对C/C源代码进行静态分析、单元测试、集成测试的测试工具。本文主要讲解如何在Linux环境下&#xff0c;搭建QT插件版的CTest测试环境。 一、…...

16k+ start 一个开源的的监控系统部署教程

安装条件 Linux或macOS系统 4GB内存 开放 33014、33174、3183端口 1.安装 1、下载源码 首先使用 git 克隆源码到本地 git clone -b main https://github.com/SigNoz/signoz.git && cd signoz/deploy/ 方式1&#xff1a;运行 install.sh 脚本一键安装 ./install.s…...

Mermaid使用教程(绘制各种图)

Mermaid使用教程&#xff08;绘制各种图&#xff09; 文章目录 Mermaid使用教程&#xff08;绘制各种图&#xff09;简介饼状图简单的例子应用案例 序列图简单案例应用案例另一个应用案例 甘特图简单案例应用案例一个更为复杂的应用案例 Git图简单案例 总结 简介 本文将主要介…...

OpenAI/ChatGPT Plus 支持的虚拟卡有哪些

最近&#xff0c;有关 OpenAI/ChatGPT Plus 需要信用卡的讨论越来越多。在这篇文章中&#xff0c;我将分享一些我在绑定信用卡过程中得到的经验和教训&#xff0c;以及 OpenAI/ChatGPT Plus 支持的卡类型。 不支持的卡 根据 OpenAI 的地区限制&#xff0c;国内和香港的卡都不…...

ARM多核调度器DSU

1. 背景 从A75开始&#xff0c;ARM提出了一个新的多核心管理系统单元&#xff0c;叫做DSU(DynamIQ Shared Unit)。DSU的核心功能是控制CPU内核&#xff0c;使其成簇Cluster使用&#xff0c;簇内每一个核心可以单独开关、调整频率/电压&#xff0c;能效表现更佳&#xff0c;甚至…...

vue解决部署文件缓存方式

问题&#xff1a;系统上线后&#xff0c;除了bug。紧急修复后&#xff0c;发现安卓正常&#xff0c;ios上海市有问题。通过debug后发现&#xff0c;ios上缓存严重。于是想到了打包文件加时间戳的方式来去除缓存。 vue2 配置打包输出文件名方式&#xff1a; const baseUrl &qu…...

游戏开发中的噪声算法

一、噪声 噪声是游戏编程的常见技术&#xff0c;广泛应用于地形生成&#xff0c;图形学等多方面。 那么为什么要引入噪声这个概念呢&#xff1f;在程序中&#xff0c;我们经常使用直接使用最简单的rand()生成随机值&#xff0c;但它的问题在于生成的随机值太“随机”了&#xf…...

CodeReview 小工具

大家开发中有没有遇到一个版本开发的非常杂&#xff0c;开发很多个项目&#xff0c;改动几周后甚至已经忘了自己改了些什么&#xff0c;领导要对代码review的时候&#xff0c;理不清楚自己改过的代码&#xff0c;只能将主要改动的大功能过一遍。这样就很容易造成review遗漏&…...

UE5 C++ Slate独立程序的打包方法

在源码版安装目录内找到已编译通过的xxx.exe&#xff0c;&#xff08;\Engine\Binaries\Win64\xxx.exe)&#xff0c;在需要的位置新建文件夹&#xff0c;拷贝源码版Engine内的Binaries、Content、Shaders文件夹到目标文件夹内&#xff0c;将xxx.exe放入对应位置&#xff0c;删除…...

探索设计模式的魅力:一篇文章让你彻底搞懂建造者模式

建造者模式&#xff08;Builder Pattern&#xff09;是一种创建型设计模式&#xff0c;旨在将一个复杂对象的创建过程与其表示分离&#xff0c;使得同样的构建过程可以创建不同的表示形式。 主要角色&#xff1a; 产品&#xff08;Product&#xff09;&#xff1a;表示正在构建…...

Facebook广告投放指南,如何运营多个Facebook广告账户不被封?

许多卖家做广告投放会选择 Facebook 作为主要的业务和产品推广平台。然而&#xff0c;要在这个竞争激烈的平台上脱颖而出并成功拓宽广告覆盖面并不容易&#xff0c;通常情况下大家会运营多个Facebook广告账号&#xff0c;但是很多人因此遭遇Facebook账号被封的情况&#xff0c;…...

音乐人声分离工具:极简的人声和背景音乐分离工具

项目地址&#xff1a;jianchang512/vocal-separate: an extremely simple tool for separating vocals and background music, completely localized for web operation, using 2stems/4stems/5stems models 这是一个极简的人声和背景音乐分离工具&#xff0c;本地化网页操作&a…...

Go语言基础快速上手

1、Go语言关键字 2、Go数据类型 3、特殊的操作 3.1、iota关键字 Go中没有明确意思上的enum&#xff08;枚举&#xff09;定义&#xff0c;不过可以借用iota标识符实现一组自增常亮值来实现枚举类型。 const (a iota // 0b // 1c 100 // 100d // 100 (与上一…...

Excel 根据日期按月汇总公式

Excel 根据日期按月汇总公式 数据透视表日期那一列右击&#xff0c;选择“组合”&#xff0c;步长选择“月” 参考 Excel 根据日期按月汇总公式Excel如何按着日期来做每月求和...

使用 crypto-js 进行 AES 加解密操作

在前端开发中&#xff0c;数据的加密和解密是为了保障用户隐私和数据的安全性而常见的任务。AES&#xff08;Advanced Encryption Standard&#xff09;是一种对称密钥加密算法&#xff0c;被广泛用于保护敏感信息的传输和存储。本文将介绍 AES 加解密的基本原理&#xff0c;并…...

Themes 与 Styles

Themes 与 Styles 主题目录&#xff1a;Source/Themes项目说明H.Theme主题核心。H.Themes.Colors.Accent强调色。H.Themes.Colors.Blue蓝色。H.Themes.Colors.Copper铜色/复古。H.Themes.Colors.Gray灰色。H.Themes.Colors.Industrial工业风。H.Themes.Colors.Mineral矿物色。H…...

使用Taotoken的Python SDK快速接入大模型API教程

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 使用Taotoken的Python SDK快速接入大模型API教程 对于希望快速将大模型能力集成到Python应用中的开发者而言&#xff0c;直接对接多…...

GD32F427以太网通信避坑指南:LAN8720的REF_CLK模式选择与SMI管理接口配置

GD32F427以太网通信避坑指南&#xff1a;LAN8720的REF_CLK模式选择与SMI管理接口配置 在嵌入式系统开发中&#xff0c;以太网通信的稳定性往往决定着整个产品的可靠性。GD32F427作为国产MCU的优秀代表&#xff0c;其内置的ENET控制器配合LAN8720 PHY芯片能够实现高效的网络通信…...

别让格式毁了你的论文:一份给IEEE TII投稿者的Latex排版自查清单

IEEE TII投稿LaTeX排版终极自查指南&#xff1a;从格式合规到学术表达优化 第一次向IEEE Transactions on Industrial Informatics&#xff08;TII&#xff09;投稿的研究者&#xff0c;往往会在收到编辑的格式审查意见时感到措手不及。那些看似微不足道的标点空格、公式编号或…...

Rainglow主题精选:程序员必备的15个最佳配色方案

Rainglow主题精选&#xff1a;程序员必备的15个最佳配色方案 【免费下载链接】jetbrains 320 color themes for JetBrains IDEs including PHPStorm, Webstorm and more. 项目地址: https://gitcode.com/gh_mirrors/je/jetbrains Rainglow Color Schemes是一款为JetBrai…...

BS-RoFormer:音频分离技术的革命性突破,从混合音乐中提取纯净音轨的终极指南

BS-RoFormer&#xff1a;音频分离技术的革命性突破&#xff0c;从混合音乐中提取纯净音轨的终极指南 【免费下载链接】BS-RoFormer Implementation of Band Split Roformer, SOTA Attention network for music source separation out of ByteDance AI Labs 项目地址: https:/…...

Cacti插件开发实战:从零开始创建自定义插件

Cacti插件开发实战&#xff1a;从零开始创建自定义插件 【免费下载链接】cacti Cacti ™ 项目地址: https://gitcode.com/gh_mirrors/ca/cacti Cacti是一款强大的网络监控和数据采集工具&#xff0c;通过插件系统可以轻松扩展其功能。本文将带你从零开始&#xff0c;掌握…...

10个Tunasync配置技巧:从基础到高级应用

10个Tunasync配置技巧&#xff1a;从基础到高级应用 【免费下载链接】tunasync Mirror job management tool. 项目地址: https://gitcode.com/gh_mirrors/tu/tunasync Tunasync 是一款强大的镜像作业管理工具&#xff0c;能够帮助用户轻松配置和管理各种镜像同步任务。…...

ElevenLabs波兰语语音突然失真?3类高频报错代码+实时调试日志解析(含波兰语IPA音素校验表)

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;ElevenLabs波兰语语音失真现象的系统性定位 ElevenLabs 的 TTS 服务在处理波兰语时&#xff0c;部分用户报告出现音素断裂、重音偏移及辅音簇&#xff08;如 szcz、 żdź&#xff09;发音模糊等失真现象。此…...

Super IO插件:Blender一键复制粘贴导入导出终极指南

Super IO插件&#xff1a;Blender一键复制粘贴导入导出终极指南 【免费下载链接】super_io blender addon for copy paste import / export 项目地址: https://gitcode.com/gh_mirrors/su/super_io 想要在Blender中实现一键导入导出模型和图像吗&#xff1f;Super IO插件…...