秒懂设计模式--学习笔记(8)【结构型-组合模式】

目录

      • 7、组合模式
          • 7.1 组合模式(Composite)
          • 7.2 叉树结构
          • 7.3 文件系统
          • 7.4 目录树展示
          • 7.5 自相似性的涌现
          • 7.6 组合模式的各角色定义
          • 7.7 组合

7、组合模式

7.1 组合模式(Composite)
  • 是针对由多个节点对象(部分)组成的树形结构的对象(整体)而发展出的一种结构型设计模式
  • 它能够使客户端在操作整体对象或者其下的每个节点对象时做出统一的响应,保证树形结构对象使用方法的一致性
  • 整体和部分,有类似结构
  • 测试类结构
    组合模式测试类
7.2 叉树结构
  • 某些具有从属关系的事物之间存在着一定的相似性
  • 不管从哪个层级,我们都会得到一个固定的结构
  • 这种结构类似于经典的“叉树”结构:无论数据元素是“根”“枝”,还是“叶”,甚至是整体的树,都具有类似的结构
  • 我们可以用组合模式来表达“部分/整体”的层次结构提取并抽象其相同的部分特殊化其不同的部分,以提高系统的可复用性与可扩展性
7.3 文件系统
  • 以类似于树结构的文件系统的目录结构为例
  • 抽象节点类Node
    • 定义一个抽象的“节点”类来模糊“文件夹”与“文件”
    • 构造方法中接收并初始化已定义的节点名,否则不允许节点被创建,这也是可以固化下来的逻辑
    • 声明抽象方法,模糊行为并留给子类去实现
package composite;/*** 抽象节点类**/
public abstract class Node {// 节点命名protected  String name;/*** 构造方法,需传入节点名*  构造方法中接收并初始化已定义的节点名,否则不允许节点被创建,这也是可以【固化下来的逻辑】*/public Node(String name) {this.name = name;}/*** 添加下级节点方法: 声明其为抽象方法,模糊此行为并留给子类去实现* @param child*/protected abstract void add(Node child) throws Exception;
}
  • 节点实现类1:文件夹类Folder
    • 文件夹类继承了抽象节点类Node
    • 文件夹下级可以包含任意多个文件夹或者文件:次级节点列表List
package composite;import java.util.ArrayList;
import java.util.List;/*** 文件夹类:继承了抽象节点类Node**/
public class Folder extends Node {/*** 文件夹可以包含子节点(子文件夹或文件)*  此处的泛型Node既可以是文件夹又可以是文件*/List<Node> children = new ArrayList<>();/*** 调用父类构造方法:初始化其文件夹名* @param name*/public Folder(String name) {super(name);}/*** 重写添加方法:可以添加子节点* @param child*/@Overrideprotected void add(Node child) {children.add(child);}
}
  • 节点实现类2:文件类File
    • 其作为末端节点,不应该具备添加子节点的功能
package composite;/*** 文件类:继承了抽象节点类Node**/
public class File extends Node {/*** 调用父类构造方法:初始化其文件夹名* @param name*/public File(String name) {super(name);}/*** 文件不包含子节点: 告知用户“不能添加子节点”* 其实更好的方式是以抛出异常的形式来确保此处逻辑的正确性,外部如果捕获到该异常则可以做出相应的处理* @param child*/@Overrideprotected void add(Node child) {System.out.println("文件类型不能添加子节点");}
}
  • 客户端测试类:创建文件夹及文件
package composite;/*** 客户端测试类**/
public class Client {public static void main(String[] args) throws Exception {// 为根节点构建了目录树Node driveD = new Folder("测试盘");// “文档”和“音乐”两个文件夹Node doc = new Folder("文档");doc.add(new File("简历.doc"));doc.add(new File("项目介绍.ppt"));driveD.add(doc);// “文档”和“音乐”两个文件夹Node music = new Folder("音乐");// 一级文件夹来区分歌手Node jay = new Folder("周杰伦");jay.add(new File("双截棍.mp3"));jay.add(new File("告白气球.mp3"));jay.add(new File("听妈妈的话.mp3"));// 一级文件夹来区分歌手Node jack = new Folder("张学友");jack.add(new File("吻别.mp3"));jack.add(new File("一千个伤心的理由.mp3"));music.add(jay);music.add(jack);driveD.add(music);}
}
7.4 目录树展示
  • 要体现出组合模式的优势还在于如何运用这个树结构
  • 分级展示整棵目录树
    • 输出节点名称(文件夹名/文件名)之前加上数个空格以表示不同层级
    • 修改抽象节点类Node并加入展示方法tree()
        /*** 此处是抽象节点类的实体方法,所以要保持其通用性。*      我们抽离出所有节点“相同”的部分作为“公有”的代码块,*      而“不同”的行为部分则留给子类去实现* @param space 空格数(层级缩进展示)*/protected void  tree(int space) {//先循环输出space个空格for (int i = 0; i < space; i++) {System.out.print("    ");}//接着再输出自己的名字System.out.println(name);}/*** 无参重载方法,默认从第0列开始展示(无层级缩进)*/protected void tree() {this.tree(0);}
    
    • 节点实现类File和Folder重写展示方法,Folder还要展示其子级
        /*** Folder* 文件夹类就比较特殊了,它不仅要先输出自己的名字,还要换行再逐个输出子节点的名字,并且要保证空格逐级递增*/@Overridepublic void tree(int space) {// 调用父类通用的tree方法列出自己的名字super.tree(space);// 在循环的子节点前,空格数要加1space++;// 下一级的子节点我们需要依次输出for (Node child : children) {// 调用子节点的tree方法child.tree(space);}}
    
    /*** File* 文件类可以不做任何修改,而是直接继承父类的展示方法,* 此处是为了更清晰直观地看到这种继承关系,同时方便后续做出其他修改* @param space*/
    @Override
    public void tree(int space){super.tree(space);
    }
    
    • 客户端在任何一级节点上只要调用其展示方法并传入当前目录所需的空格偏移量,就可出现树形列表了
    	// Client类的main方法最后添加调用目录树展示方法driveD.tree();
    
    • 空格偏移量这个必传参数,可以为抽象节点类添加一个无参的展示方法,默认为0
7.5 自相似性的涌现
  • 组合模式将树形结构的特点发挥得淋漓尽致
    • 作为最高层级抽象的抽象节点类(接口)泛化了所有节点类使任何“整体”或“部分”达成统一
    • 枝(根)节点与叶节点的多态化实现以及组合关系进一步勾勒出的树形结构
7.6 组合模式的各角色定义
  • Component(组件接口):
    • 所有复合节点与叶节点的高层抽象,定义出需要对组件操作的接口标准
    • 如抽象节点类Node,具体使用接口还是抽象类需根据具体场景而定。
  • Composite(复合组件):
    • 包含多个子组件对象(可以是复合组件或叶端组件)的复合型组件,并实现组件接口中定义的操作方法。
    • 如:“根节点/枝节点”的文件夹类Folder
  • Leaf(叶端组件):
    • 不包含子组件的终端组件,同样实现组件接口中定义的操作方法。
    • 如: “叶节点”的文件类File
  • Client(客户端):
    • 按所需的层级关系部署相关对象并操作组件接口所定义的接口,即可遍历树结构上的所有组件
7.7 组合
  • 类似的结构总是在重复、迭代地显现出某种自似性
  • 其部分与整体一致的呈现与“组合模式”如出一辙

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

centos部署jar包

第一步&#xff1a; 将IDEA中的项目打包为jar,将这个jar文件放到centos服务器上的目录里&#xff0c;我在opt新建api目录&#xff0c;将jar文件放入&#xff0c;如下图&#xff1a; 第二步&#xff1a; 将需要读取的配置文件也放入此目录(其他目录也可以&#xff0c;和脚本中…

Thread类的start()方法和run()方法的区别

在Java多线程编程中&#xff0c;Thread类是一个非常重要的类&#xff0c;它提供了创建和管理线程的能力。对于初学者来说&#xff0c;理解Thread类的start()方法和run()方法之间的区别尤为重要。本文将深入探讨这两者之间的不同&#xff0c;帮助读者更好地掌握Java多线程编程的…

web端的vscode编辑器

下载code-server到本地 略 参考 https://blog.csdn.net/kfashfasf/article/details/137110668 运行code-server 到用户目录下设置 vim ~/.config/code-server/config.yaml . bind-addr: 0.0.0.0:8080 auth: password password: xxxxxx cert: false运行 [centosamazon22 ~…

中职网络安全wire0077数据包分析

从靶机服务器的FTP上下载wire0077.pcap&#xff0c;分析该文件&#xff0c;找出黑客入侵使用的协议&#xff0c;提交协议名称 SMTP 分析该文件&#xff0c;找出黑客入侵获取的zip压缩包&#xff0c;提交压缩包文件名 DESKTOP-M1JC4XX_2020_09_24_22_43_12.zip 分析该文件&…

使用Godot4组件制作竖版太空射击游戏_2D卷轴飞机射击-滚动背景(四)

文章目录 开发思路开发思路 使用Godot4组件制作竖版太空射击游戏_2D卷轴飞机射击&#xff08;一&#xff09; 使用Godot4组件制作竖版太空射击游戏_2D卷轴飞机射击-激光组件&#xff08;二&#xff09; 使用Godot4组件制作竖版太空射击游戏_2D卷轴飞机射击-飞船动画&#xff08…

pytorch-RNN实战-正弦曲线预测

目录 1. 正弦数据生成2. 构建网络3. 训练4. 预测5. 完整代码6. 结果展示 1. 正弦数据生成 曲线如下图&#xff1a; 代码如下图&#xff1a; 50个点构成一个正弦曲线随机生成一个0~3之间的一个值&#xff08;随机的原因是防止每次都从相同的点开始&#xff0c;50个点的正弦曲…

JavaSE 面向对象程序设计进阶 IO流 字节流详解 抛出异常

input output 像水流一样读取数据 存储和读取数据的解决方案 内存中数据不能永久化存储 程序停止运行 数据消失 File只能对文件本身进行操作 不能读写文件里存储的数据 读写数据必须要有IO流 可以把程序中的数据保存到文件当中 还可以把本地文件中的数据读取到数据当中 分…

白酒营销策划全攻略:从市场调研到执行落地的实战指南!

为白酒品牌做营销策划&#xff0c;那可得像给自家的孩子挑衣服一样&#xff0c;得量身定制&#xff0c;得考虑孩子的身材、喜好&#xff0c;还得看看衣服的款式和布料。 这里可以分享一点自己多年的实战干货给你&#xff0c;希望对你有所帮助。 首先&#xff0c;得做好“侦查…

【常见开源库的二次开发】一文学懂CJSON

简介&#xff1a; JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式。它基于JavaScript的一个子集&#xff0c;但是JSON是独立于语言的&#xff0c;这意味着尽管JSON是由JavaScript语法衍生出来的&#xff0c;它可以被任何编程语言读取和生成…

CentOS7系统上安装MySQL8.0(rpm-bundle.tar)详细过程

一、MySQL官网下载安装包 1.进入官网MySQL :: Download MySQL Community Server 2.查看自己的版本和架构 uname -mcat /etc/redhat-release 3.选择对应版本并下载 4.查看linux自带的mariadb数据库&#xff0c;有就卸载掉。 rpm -qa | grep mariadbrpm -e mariadb-libs…

【卡尔曼滤波】高斯白噪声

生成高斯白噪声并将其应用于信号处理 生成高斯白噪声并将其应用于信号处理 #以下是一个生成高斯白噪声并将其应用于信号处理的示例代码:import numpy as np import matplotlib.pyplot as plt import matplotlib.font_manager ## not work#notice matplotlibrc is a file, not…

学生选课管理系统(Java+MySQL)

技术栈 Java: 用于实现系统的核心业务逻辑。MySQL: 作为关系型数据库&#xff0c;用于存储系统中的数据。JDBC: 用于Java程序与MySQL数据库之间的连接和交互。Swing GUI: 用于创建图形用户界面&#xff0c;提升用户体验。 系统功能 我们的学生选课管理系统主要针对学生和管理…

突破传统:实现智慧校园实习单位变更

在智慧校园的实习管理系统设计中&#xff0c;充分考虑到了实习阶段学生可能遇到的实际需求&#xff0c;特别是实习单位变更这一灵活性要求&#xff0c;系统特设了一套完善的在线处理机制&#xff0c;旨在促进学生、学校与企业间的顺畅沟通与协调&#xff0c;确保实习过程的平稳…

Gmail邮件提醒通知如何设置?有哪些方法?

Gmail邮件提醒通知功能怎么样&#xff1f;通知邮件怎么有效发送&#xff1f; Gmail作为全球广泛使用的电子邮件服务&#xff0c;提供了多种邮件提醒通知功能&#xff0c;帮助用户不错过重要信息。AokSend将详细介绍如何设置Gmail邮件提醒通知&#xff0c;确保您不会错过任何重…

IT审计必看!对比旧版,CISA考试改版升级亮点和重点内容是什么?

官方通知&#xff0c;今年8月1日&#xff0c;CISA新版考纲正式上线&#xff0c;旧版在7月23日后就无法约考了。 艾威培训邀请了国内知名的IT审计CISA授课老师吴老师来为大家详细讲解CISA新版考纲的变化 目前第28th版教材只有英文版&#xff0c;中文版尚未发布。我们艾威经验丰…

【NOI-题解】1108 - 正整数N转换成一个二进制数1290 - 二进制转换十进制1386 - 小丽找半个回文数1405 - 小丽找潜在的素数?

文章目录 一、前言二、问题问题&#xff1a;1108 - 正整数N转换成一个二进制数问题&#xff1a;1290 - 二进制转换十进制问题&#xff1a;1386 - 小丽找半个回文数问题&#xff1a;1405 - 小丽找潜在的素数&#xff1f; 三、感谢 一、前言 本章节主要对进制转换的题目进行讲解…

【UNI-APP】阿里NLS一句话听写typescript模块

阿里提供的demo代码都是javascript&#xff0c;自己捏个轮子。参考着自己写了一个阿里巴巴一句话听写Nls的typescript模块。VUE3的组合式API形式 startClient&#xff1a;开始听写&#xff0c;注意下一步要尽快开启识别和传数据&#xff0c;否则6秒后会关闭 startRecognition…

javascript高级部分笔记

javascript高级部分 Function方法 与 函数式编程 call 语法&#xff1a;call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 定义&#xff1a;调用一个对象的一个方法&#xff0c;以另一个对象替换当前对象。 说明&#xff1a;call 方法可以用来代替另一个对象调用一个方法。cal…

侯捷C++面向对象高级编程(下)-2-non-explicit one argument constructor

1.构造函数 构造函数: Fraction(int num, int den 1) 初始化分子和分母&#xff0c;允许指定分子 num 和可选的分母 den。默认情况下&#xff0c;分母为 1。 加法运算符重载: Fraction operator(const Fraction& f) 重载了加法运算符 。这使得两个 Fraction 对象可以通过 …

NodeJS校园快递智能互助平台-计算机毕业设计源码58554

摘 要 随着校园人口的增加和生活节奏的加快&#xff0c;校园快递成为一个重要的服务需求。然而&#xff0c;传统的校园快递方式存在一些问题&#xff0c;例如无法满足快速和高效的需求&#xff0c;易发生丢失或损坏的情况&#xff0c;同时也给快递人员和用户带来不便。因此&am…