Java设计模式 _结构型模式_组合模式

一、组合模式

1、组合模式
组合模式(Composite Pattern)是这一种结构型设计模式。又叫部分整体模式。组合模式依据树形结构来组合对象,用来表示部分以及整体层次关系。即:创建了一个包含自己对象组的类,该类提供了修改相同对象组的方式。

2、示例场景
(1)、公司管理管理关系。如,总经理直接下级包含多个总监,每个总监下包含多个负责人,每个负责人下包含多个具体员工
(2)、其他一些树形结构使用的场景。

3、实现思路
(1)、实体类中,定义包含自身对象或者自身对象集合的属性。
(2)、定义添加和删除自身集合属性方法。
(3)、定义展示或操作自身及孩子节点的具体业务方法。

二、代码示例

1、代码示例

// 定义文件系统抽象类规范
import lombok.Data;
import java.util.List;
@Data
public abstract class FileSystemElement {protected String name;protected List<FileSystemElement> elementList;public abstract boolean addElement(FileSystemElement element);public abstract boolean removeElement(FileSystemElement element);public abstract void showElement();
}
// 定义文件夹实现类
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;public class FolderElement extends FileSystemElement {public FolderElement(String name) {this.name = name;}@Overridepublic boolean addElement(FileSystemElement element) {if (this.elementList==null){this.elementList = new ArrayList<>();}this.elementList.add(element);return true;}@Overridepublic boolean removeElement(FileSystemElement element) {if (!CollectionUtils.isEmpty(elementList)) {for (FileSystemElement systemElement : elementList) {if (element.getName().equals(systemElement.getName())) {elementList.remove(systemElement);break;}}}return true;}@Overridepublic void showElement() {System.out.println("目录名称:" + name+",包含内容如下:");if (!CollectionUtils.isEmpty(elementList)) {for (FileSystemElement systemElement : elementList) {systemElement.showElement();}}System.out.println("目录名称:" + name+",包含如上" );}
}
// 定义文件实现类
public class FileElement extends FileSystemElement {public FileElement(String name) {this.name = name;}@Overridepublic boolean addElement(FileSystemElement element) {System.out.println("当前节点为文件,不能创建节点");return false;}@Overridepublic boolean removeElement(FileSystemElement element) {System.out.println("当前节点为文件,不能删除节点");return false;}@Overridepublic void showElement() {System.out.println("文件名称:" + name);}
}
// 测试
public static void main(String[] args) {FileSystemElement rootDir = new FolderElement("根目录");FileSystemElement dir1 = new FolderElement("目录1");FileSystemElement dir2 = new FolderElement("目录2");FileSystemElement dir3 = new FolderElement("目录3");FileSystemElement file1 = new FileElement("文件1");FileSystemElement file2 = new FileElement("文件2");FileSystemElement file3 = new FileElement("文件3");rootDir.addElement(dir1);rootDir.addElement(dir2);dir1.addElement(dir3);dir1.addElement(file1);dir2.addElement(file2);dir3.addElement(file3);rootDir.showElement();  // 展示根节点的文件系统信息}

运行结果:
可以看到当完整的构建了组合模式的时候,能够根据其中的一个节点获取到相关子节点的信息。
在这里插入图片描述

总结:
本例仅展示了一个子节点的信息,如果需要定义兄弟节点等多个维度的信息,则需要定义多个属性实例及对应的增删方法。

学海无涯苦作舟!!!

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

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

相关文章

代码随想录——双指针与滑动窗口(四)

一.1423. 可获得的最大点数 题目详情 解题思路 这里我们每次只能取最左或最右边的卡牌,第一反应其实是使用双指针&#xff0c;通过局部贪心来解决&#xff0c;但是如果两边相等的话用局部贪心无法来判断到底取哪一边&#xff0c;那我们不妨换一个思路&#xff1a; 我们首先任…

AI项目二十一:视频动态手势识别

若该文为原创文章&#xff0c;转载请注明原文出处。 一、简介 人工智能的发展日新月异&#xff0c;也深刻的影响到人机交互领域的发展。手势动作作为一种自然、快捷的交互方式&#xff0c;在智能驾驶、虚拟现实等领域有着广泛的应用。手势识别的任务是&#xff0c;当操作者做出…

【QT教程】QT6图形渲染与OpenGL编程

QT6图形渲染与OpenGL编程 使用AI技术辅助生成 QT界面美化视频课程 QT性能优化视频课程 QT原理与源码分析视频课程 QT QML C扩展开发视频课程 免费QT视频课程 您可以看免费1000个QT技术视频 免费QT视频课程 QT统计图和QT数据可视化视频免费看 免费QT视频课程 QT性能优化视频免…

写文献综述常用的几种深度神经网络模型!

写文献综述常用的几种深度神经网络模型 卷积神经网络&#xff08;CNN&#xff09; 解释说明&#xff1a;专门用于处理图像和图像数据的深度学习模型。它通过卷积层、池化层等操作提取图像特征。应用&#xff1a;图像分类、目标检测、人脸识别等。未来改进&#xff1a;进一步提…

Linux 文件管理命令sum setfacl getfacl chacl

文章目录 2.Linux 文件管理命令2.58 sum&#xff1a;计算文件的校验和&#xff0c;以及文件占用的块数案例练习 2.59 setfacl&#xff1a;设定文件访问控制列表案例练习 2.60 getfacl&#xff1a;获取文件访问控制列表案例练习 2.61 chacl&#xff1a;更改文件或目录的访问控制…

Docker使用方法

Docker是一种容器化平台&#xff0c;它可以帮助开发人员将应用程序和其依赖项打包成一个独立的、可移植的容器&#xff0c;以便在不同的环境中运行。 以下是使用Docker的基本步骤&#xff1a; 安装Docker&#xff1a;首先&#xff0c;您需要在您的机器上安装Docker。您可以从D…

Pytorch:神经网络过程代码详解

文章目录 一、基本概念1、epoch2、遍历DataLoader 二、神经网络训练过程代码详解步骤一&#xff1a;选择并初始化优化器步骤二&#xff1a;计算损失步骤三&#xff1a;反向传播步骤四&#xff1a;更新模型参数步骤五&#xff1a;清空梯度组合到训练循环中步骤六&#xff1a;保存…

windows和mac 电脑 部署Ollama

官网地址&#xff1a;https://ollama.com/ github地址&#xff1a;https://github.com/ollama/ollama 一、windows下 https://github.com/ollama/ollama 安装大模型 ollama run llama3 下载的大模型地址&#xff1a; C:\Users\dengg\.ollama 4.34G

二维数组-----刷题2

题目不是傻子题目&#xff0c;但很简单&#xff01;定义一个变量k&#xff0c;在嵌套中不断累加输出即可。 #include<cstdio> int k,n; int main(){scanf("%d",&n);for(int i1;i<n;i){for(int j1;j<n;j){k;printf("%d ",k);}printf("…

Python基础学习之记录中间文件

倘若想记录代码运行过程中的结果文件&#xff0c;那么以下函数仅供参考 代码示例&#xff1a; import os import datetime import sys import pandas as pd# 定义总的文件夹路径 base_folder E:\\D\\log\\product_data_compare_log# 定义一个函数来创建带时间戳的文件夹 def…

LoRa模块在智能灌溉系统中的应用特点介绍

LoRa模块在智能灌溉系统中的应用特点主要体现在以下几个方面&#xff1a; 低功耗与长寿命&#xff1a; LoRa模块具有极低的功耗&#xff0c;使其在待机状态下耗电量极低&#xff0c;能够支持长时间连续运行&#xff0c;减少了频繁更换电池或充电的需求&#xff0c;确保了智能灌…

【Godot4.2】有序和无序列表函数库 - myList

概述 在打印输出或其他地方可能需要构建有序或无序列表。本质就是构造和维护一个纯文本数组。并用格式化文本形式&#xff0c;输出带序号或前缀字符的多行文本。 为此我专门设计了一个类myList&#xff0c;来完成这项任务。 代码 以下是myList类的完整代码&#xff1a; # …

SQL Sever无法连接服务器

SQL Sever无法连接服务器&#xff0c;报错证书链是由不受信任的颁发机构颁发的 解决方法&#xff1a;不用ssl方式连接 1、点击弹框中按钮“选项” 2、连接安全加密选择可选 3、不勾选“信任服务器证书” 4、点击“连接”&#xff0c;可连接成功

python安卓自动化pyaibote实践------学习通自动刷课

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文是一个完成一个自动播放课程&#xff0c;避免人为频繁点击脚本的构思与源码。 加油&#xff01;为实现全部电脑自动化办公而奋斗&#xff01; 为实现摆烂躺平的人生而奋斗&#xff01;&#xff01;&#xff…

视觉语言模型详解

视觉语言模型可以同时从图像和文本中学习&#xff0c;因此可用于视觉问答、图像描述等多种任务。本文&#xff0c;我们将带大家一览视觉语言模型领域: 作个概述、了解其工作原理、搞清楚如何找到真命天“模”、如何对其进行推理以及如何使用最新版的 trl 轻松对其进行微调。 什…

【C语言】指针篇-精通库中的快速排序算法:巧妙掌握技巧(4/5)

&#x1f308;个人主页&#xff1a;是店小二呀 &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &#x1f308;C笔记专栏&#xff1a; C笔记 &#x1f308;喜欢的诗句:无人扶我青云志 我自踏雪至山巅 文章目录 一、回调函数二、快速排序(Qsort)2.1 Qsort参数部分介绍2.2 不…

报错“Install Js dependencies failed”【鸿蒙开发Bug已解决】

文章目录 项目场景:问题描述原因分析:解决方案:此Bug解决方案总结Bug解决方案寄语项目场景: 最近也是遇到了这个问题,看到网上也有人在询问这个问题,本文总结了自己和其他人的解决经验,解决了【报错“Install Js dependencies failed”】的问题。 报错如下 问题描述 …

leetcode 92. 反转链表 II

class Solution(object):def reverseBetween(self, head, left, right):""":type head: ListNode:type left: int:type right: int:rtype: ListNode""" right right -1left left -1while( right-left>0 ):print(right-left)# 左侧节点l …

零基础玩转Linux+Ubuntu实战视频课程

零基础玩转LinuxUbuntu实战视频课程 Linux发行版之间的关系jpg 1-1课程简介及Linux学习路线介绍.mp4 1-10什么是环境变量.mp4 1-11文件系统管理.mp4 1-12用户账户管理.mp4 1-13文件的访问权限.mp4 1-14进程管理.mp4 1-15软件源码包的编译、安装与卸裁.mp4 1-16制作自己的deb软…

WRF原理与基本操作

WRF介绍 WPS是三个&#xff0c;它们协同工作&#xff0c;为真实数据模拟的输入准备输出资料,为真实数据模拟做预处理。 geogrid定义模式范围&#xff0c;将静态地形资料插值到格点 ; ungrib将气象数据从GRIB格式解码 提取气象场; metgrid将ungrib解码的气象场水平地插值到geog…