设计模式-组合模式

核心思想

  • 组合模式可以使用一棵树来表示
  • 组合模式使得用户可以使用一致的方法操作单个对象和组合对象
  • 组合模式又叫部分整体模式,将对象组合成树形结构以表示“部分-整体”的层次结构,可以更好的实现管理操作,部分-整体对象的操作基本一样,但是应该还会有不一样的地方

场景使用

  • 比如文件夹和文件,都有增加、删除等api,也有层级管理关系
  • 比如公司,总公司下有子公司,每个公司的部门都类似

在这里插入图片描述

优缺点

优点

  • 方便创建出复杂的层次结构
  • 客户端只需要面对一致的对象而不用考虑整体部分的问题

缺点

  • 需要花更多的时间理清类之间的层次关系

代码示例

根节点(抽象类-Component)

public abstract class Root {private String name;public Root(String name){this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}public abstract void addFile(Root root);public abstract void removeFile(Root root);public abstract void display(int depth);}

具体文件夹类(Composite)


public class Folder extends Root {private List<Root> folders = new ArrayList<>();public Folder(String name) {super(name);}public List<Root> getFolders() {return folders;}public void setFolders(List<Root> folders) {this.folders = folders;}@Overridepublic void addFile(Root root) {folders.add(root);}@Overridepublic void removeFile(Root root) {folders.remove(root);}@Overridepublic void display(int depth) {StringBuilder sb = new StringBuilder();for (int i = 0; i < depth; i++) {sb.append("-");}//打印横线和当前文件名System.out.println(sb.toString() + this.getName());for (Root r : folders) {//每个下级r.display(depth + 1);}}
}

具体的文件(Leaf)


public class File extends Root {public File(String name) {super(name);}@Overridepublic void addFile(Root root) {}@Overridepublic void removeFile(Root root) {}@Overridepublic void display(int depth) {StringBuilder sb = new StringBuilder();for (int i = 0; i < depth; i++) {sb.append("-");}//打印横线和当前文件名System.out.println(sb.toString() + this.getName());}
}

测试

public class AppRun {public static void main(String[] args) {//创造根⽂件夹Root root1 = new Folder("root");//建⽴⼦⽂件Root comp1 = new Folder("Composite1");Root comp2 = new Folder("Composite2");//建⽴⽂件夹关系root1.addFile(comp1);root1.addFile(comp2);//建⽴⽂件关系comp1.addFile(new File("leafA"));comp2.addFile(new File("leafB"));//展示root1.display(1);}
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/111487.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jmeter+ServerAgent

一、Jmeter 下载 https://jmeter.apache.org/download_jmeter.cgi选择Binaries二进制下载 apache-jmeter-5.6.2.tgz 修改配置文件 jmeter下的bin目录&#xff0c;打开jmeter.properties 文件 languagezh_CN启动命令 cd apache-jmeter-5.6/bin sh jmeter二、ServerAgent 监…

基于单片机的智能小车设计

一、项目介绍 随着科技的发展&#xff0c;智能机器人在日常生活中的应用越来越广泛。智能小车作为智能机器人的一种&#xff0c;具有便携性和多功能的特点&#xff0c;在教育、娱乐和工业等领域得到了广泛关注和应用。智能小车可以通过远程控制实现各种动作&#xff0c;如前进…

Java集合sort排序报错UnsupportedOperationException处理

文章目录 报错场景排查解决UnmodifiableList类介绍 报错场景 我们使用的是PostgreSQL数据库&#xff0c;存储业务数据&#xff0c;业务代码使用的是Spring JPA我们做的是智慧交通信控平台&#xff0c;有个功能是查询展示区域的交通态势&#xff0c;需要按照不同维度排序展示区…

从零开始的Hadoop学习(四)| SSH无密登录配置、集群配置

1. SSH 无密登录配置 1.1 配置 ssh &#xff08;1&#xff09;基本语法 ssh 另一台电脑的IP地址 &#xff08;2&#xff09;ssh 连接时出现 Host key verification failed 的解决方法 [atguiguhadoop102 ~]$ ssh hadoop103&#xff08;3&#xff09;回退到 hadoop102 [at…

uniapp 配置小程序分包

分包可以减少小程序首次启动时的加载时间 分包页面&#xff08;例如&#xff1a;商品详情页、商品列表页&#xff09;。在 uni-app 项目中&#xff0c;配置分包的步骤如下&#xff1a; 1、右键点击根目录&#xff0c;新建&#xff0c;点击创建分包的根目录&#xff0c;命名为 …

【ES6】Getter和Setter

JavaScript中的getter和setter方法可以用于访问和修改对象的属性。这些方法可以通过使用对象字面量或Object.defineProperty()方法来定义。 以下是使用getter和setter方法的示例&#xff1a; <!DOCTYPE html> <script>const cart {_wheels: 4,get wheels(){retu…

hadoop学习:mapreduce入门案例二:统计学生成绩

这里相较于 wordcount&#xff0c;新的知识点在于学生实体类的编写以及使用 数据信息&#xff1a; 1. Student 实体类 import org.apache.hadoop.io.WritableComparable;import java.io.DataInput; import java.io.DataOutput; import java.io.IOException;public class Stude…

day-04 基于UDP的服务器端/客户端

一.理解UDP &#xff08;一&#xff09;UDP套接字的特点 UDP套接字具有以下特点&#xff1a; 无连接性&#xff1a;UDP是一种无连接的协议&#xff0c;这意味着在发送数据之前&#xff0c;不需要在发送方和接收方之间建立连接。每个UDP数据包都是独立的&#xff0c;它们可以独…

Matlab图像处理-垂直镜像

垂直镜像 图像的垂直镜像操作是以原图像的水平中轴线为中心&#xff0c;将图像分为上下两部分进行对称变换。 设原始图像的宽为w&#xff0c;高为h&#xff0c;原始图像中的点为(&#x1d465;0,&#x1d466;0)(x_0,y_0)&#xff0c;对称变换后的点为(&#x1d465;1,&#…

【CI/CD技术专题】「Docker实战系列」本地进行生成镜像以及标签Tag推送到DockerHub

背景介绍 Docker镜像构建成功后&#xff0c;只要有docker环境就可以使用&#xff0c;但必须将镜像推送到Docker Hub上去。创建的镜像最好要符合Docker Hub的tag要求&#xff0c;因为在Docker Hub注册的用户名是liboware&#xff0c;最后利用docker push命令推送镜像到公共仓库…

Databend 开源周报第 108 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 多源数据目录 …

墨西哥专线全程一站式服务包括哪些服务?

墨西哥专线全程一站式服务是指货物从起运地到目的地的整个运输过程中&#xff0c;提供的一系列综合服务。以下是墨西哥专线全程一站式服务可能包括的主要服务项目&#xff1a; 一、国际货运 墨西哥专线全程一站式服务通常包括国际货运服务&#xff0c;即货物从起运地到墨西哥的…

【08期】ArrayList常见面试题

简介 ArrayList是我们开发中非常常用的数据存储容器之一&#xff0c;其底层是数组实现的&#xff0c;我们可以在集合中存储任意类型的数据&#xff0c;ArrayList是线程不安全的&#xff0c;非常适合用于对元素进行查找&#xff0c;效率非常高。 线程安全性 对ArrayList的操作…

yolov8使用C++推理的流程及注意事项

1.下载yolov8项目源码GitHub - ultralytics/ultralytics: NEW - YOLOv8 &#x1f680; in PyTorch > ONNX > OpenVINO > CoreML > TFLite 2.下载opencvReleases - OpenCV,建议版本>4.7.0,选择下载源码&#xff0c; windows版本由于使用的编译器与我们所使用的m…

2023年腾讯云轻量应用服务器优缺点大全

2023年腾讯云轻量应用服务器优缺点大全&#xff0c;腾讯云轻量应用服务器性能如何&#xff1f;轻量服务器CPU内存带宽配置高&#xff0c;CPU采用什么型号主频多少&#xff1f;轻量应用服务器会不会比云服务器CVM性能差&#xff1f;腾讯云服务器网详解CPU型号主频、内存、公网带…

ubuntu入门01——windows上直接部署linux(WSL)

win10安装参考如下教程&#xff1a; 旧版 WSL 的手动安装步骤 | Microsoft Learn 说明&#xff1a;该文档是我按如上教程安装使用Ubuntu写的回顾&#xff0c;家人们参考官方教程更妙。 1.启用适用于Linux的wundows子系统 2.启用虚拟机功能 dism.exe /online /enable-feat…

MySQL数据备份与恢复

备份的主要目的&#xff1a; 备份的主要目的是&#xff1a;灾难恢复&#xff0c;备份还可以测试应用、回滚数据修改、查询历史数据、审计等。 日志&#xff1a; MySQL 的日志默认保存位置为&#xff1a; /usr/local/mysql/data##配置文件 vim /etc/my.cnf [mysqld] ##错误日志…

行业趋势和新兴领域分析:分析当前网络安全行业的发展趋势,如IoT安全、AI安全、区块链安全等。

第一章&#xff1a;引言 随着数字化时代的迅速发展&#xff0c;网络安全已经成为各行各业不可忽视的重要领域。恶意攻击、数据泄露以及黑客入侵等威胁逐渐增多&#xff0c;推动着网络安全行业不断创新与进步。本文将深入探讨当前网络安全领域的发展趋势&#xff0c;聚焦于新兴…

智慧校园用电安全解决方案

随着科技的不断发展&#xff0c;智慧校园建设逐渐成为了教育行业的一大趋势。在这个过程中&#xff0c;电力系统作为校园基础设施的重要组成部分&#xff0c;其安全、稳定、高效的运行显得尤为重要。下面小编来为大家介绍下智慧校园用电安全解决方案吧! 一、智慧校园电力系统现…

Ubuntu下的QT开发

ubuntu安装QT的组件如下&#xff1a; 若要在ubuntu下启动QT有两种方案&#xff0c;一种是在菜单栏搜索qt双QT Create&#xff1b;另一种则是使用命令&#xff1a;/opt/Qt5.12.9/Tools/QtCreator/bin/qtcreator.sh