设计模式14——组合模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。

组合模式(Composite)

是一种行为型模式。

目录

一、概述

1.1、主要的角色有三种:

1.2、直观的理解组合模式:

1.3、技术角度,描述对象之间关系的UML图:

二、举例

2.1、分析如下:

2.2、对象之间的关系用UML图表示如下:

2.3、Java实现代码如下:


一、概述

1、将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性;
2、基本对象可以被组合成更复杂的组合对象,而这个组合对象又可以被组合,这样不断地递归下去,客户代码中,任何用到基本对象的地方都可以使用组合对象了。

1.1、主要的角色有三种:

  1. 组合(或组件)的抽象类或接口
  2. 分支类
  3. 叶子类

1.2、直观的理解组合模式:

其实可以把组合模式当做建立一个树形结构,然后可以对这个树的所有节点进行统一操作,同样这个树还可以根据需要添加删除其它节点或树,从而组成更大的树或更小的树。

1.3、技术角度,描述对象之间关系的UML图:

二、举例

简单举例,如下图所示,我们要实现这个结构,并且打印每个节点的名字。

2.1、分析如下:

1、分析上述问题:

  • 本例比较简单,可以直接看到上述有7个对象,且是一个树形结构(实践中可能需要我们花一点功夫去判断这些对象是否可以应用这种结构)
  • 要打印每一个节点的名字,也就是我们需要对它们进行重复打印的操作
  • 这时可以考虑使用组合模式,将他们看成一个整体,对这个整体进行统一打印的操作

2、针对角色和方法设计上:

组合(或组件)的抽象类或接口

  • 创建一个抽象节点

分支类

  • 本例有三个分支,名字需要分别设置

叶子类

  • 本例有四个叶子,名字需要分别设置

自定义方法:

  • 输出本节点名字

2.2、对象之间的关系用UML图表示如下:

2.3、Java实现代码如下:

组合(组件)的抽象类:

abstract class Component {protected String name;public Component(String name) {this.name = name;}public abstract void add(Component component);public abstract void remove(Component component);public abstract void display(int depth);
}

分支类:

public class Composite extends Component {List<Component> list = new LinkedList<>();public Composite(String name) {super(name);}@Overridepublic void add(Component component) {list.add(component);}@Overridepublic void remove(Component component) {list.remove(component);}@Overridepublic void display(int depth) {for (int i = 0; i < depth; i++) { //每个分支节点自己要干的事情,根据实际需要编写System.out.print("-");}System.out.println(this.name);for (Component component : list) { //遍历此分支节点的子节点,必须要有component.display(depth + 2);}//...}
}

叶子类:

public class Leaf extends Component {public Leaf(String name) {super(name);}@Overridepublic void add(Component component) {System.out.println("叶子节点没有添加子节点功能!");//...}@Overridepublic void remove(Component component) {System.out.println("叶子节点没有删除子节点功能!");//...}@Overridepublic void display(int depth) {for (int i = 0; i < depth; i++) { //每个叶子节点自己要干的事情,根据实际需要编写System.out.print("-");}System.out.println(this.name);//...}
}

 主程序(发起请求的类):

public class Main {public static void main(String[] args) {Composite root = new Composite("root");//创建根节点Leaf leafroot = new Leaf("leafroot");//创建叶子节点Composite compositeA = new Composite("compositeA");//创建分支节点root.add(leafroot);root.add(compositeA);Leaf leafA = new Leaf("leafA");//创建叶子节点Composite compositeAA = new Composite("compositeAA");//创建分支节点compositeA.add(leafA);compositeA.add(compositeAA);Leaf leafAAA = new Leaf("leafAAA");//创建叶子节点Leaf leafAAB = new Leaf("leafAAB");//创建叶子节点compositeAA.add(leafAAA);compositeAA.add(leafAAB);root.display(1);}
}

这里就不再举例了,可以把上面的Java例子复制到你本地,运行main函数试一下加深理解。这些代码都是我自己学习的时候根据一些教材手敲的,不存在bug可以直接运行。

如果觉得本文还不错,就请点个赞吧!如果有建议,也请评论指教和讨论!

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

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

相关文章

废物回收机构|基于SprinBoot+vue的地方废物回收机构管理系统(源码+数据库+文档)

地方废物回收机构管理系统 目录 基于SprinBootvue的地方废物回收机构管理系统 一、前言 二、系统设计 三、系统功能设计 1管理员功能模块 2 员工功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍…

【minio】minio文件访问不到问题记录

问题描述&#xff1a; 项目上上传了logo&#xff0c;但是无法回写logo&#xff0c;但是文件minio路径已经返回&#xff0c;并且到minio服务器上也能下载文件&#xff1b; 解决方案&#xff1a; 1.排查Nginx的代理的minio是否正确 2.登录minio服务查一下文件路径policy是否设置访…

在某云服务器上搭建公网kali linux2.0

前提&#xff1a; 可用的 CVM 实例 挂载一个系统盘之外的盘&#xff0c;安装完成后可卸载&#xff01; 创建实例&#xff0c;安装centos7系统&#xff01; 然后执行fdisk -l看磁盘的情况 在这里我将把镜像写入vdb这块数据盘 非 root 的情况下记得sudo执行以下命令 注意&…

机器学习之常用算法与数据处理

一、机器学习概念&#xff1a; 机器学习是一门多领域交叉学科&#xff0c;涉及概率论、统计学、计算机科学等多门学科。它的核心概念是通过算法让计算机从数据中学习&#xff0c;改善自身性能。机器学习专门研究计算机怎样模拟或实现人类的学习行为&#xff0c;以获取新的知识…

jmeter保存测试计划报错——Couldn‘t save test plan to file:

jmeter保存测试计划报错——Couldnt save test plan to file:。。。。。拒绝访问 一、问题描述二、分析三、结果 一、问题描述 Couldn’t save test plan to file:D:\Program Files\apache-jmeter-5.6.2\bin\线程组.jmx D:\Program Files\apache-jmeter-5.6.2\bin\线程组.jmx(…

用WPS将多张图片生成一个pdf文档,注意参数设置

目录 1 新建一个docx格式的文档 2 向文档中插入图片 3 设置页边距 4 设置图片大小 5 导出为pdf格式 需要把十几张图片合并为一个pdf文件&#xff0c;本以为很简单&#xff0c;迅速从网上找到两个号称免费的在线工具&#xff0c;结果浪费了好几分钟时间&#xff0c;发现需要…

【汽车操作系统】Autosar和商用OS

目录 什么是AUTOSAR? CP AUTOSAR架构 CAN通信 AP AUTOSAR 背景 CP&AP 开发方面的不同&#xff1a; WRLinux介绍 QNX介绍 什么是AUTOSAR? 随着汽车功能越来越多&#xff0c;导致ECU的数量越来越多。1993年的时候&#xff0c;奥迪A8才只有5个ECU现在典型的现代汽车…

shell文本三剑客——awk命令【☆】

目录 一、akw原理 二、命令格式 三、常用变量 四、awk的用法 1.输出整行内容 2.按字段输出文本内容 3.按列输出文件内容 FS变量为列分隔符 4.awk的三个模式 5. awk ‘控制语句条件 {操作}’ 文件 6.awk的数组 7.awk的应用 一、akw原理 逐行读取文本&#xff0c;默认…

TypeScript-泛型

泛型(Generics) 指在定义接口&#xff0c;函数等类型的时候&#xff0c;不预先指定具体的类型&#xff0c;而在使用的时候再指定类型的一种特性&#xff0c;使用泛型可以复用类型并且让类型更加灵活 泛型接口-interface 语法&#xff1a;在 interface 接口类型的名称后面使用…

《基于Jmeter的性能测试框架搭建》改进一

《基于Jmeter的性能测试框架搭建》文末笔者提到了不少待改进之处&#xff0c;如下所示。 Grafana性能图表实时展现&#xff0c;测试过程中需实时截图形成测试报告&#xff0c;不够人性化。解决方案&#xff1a;自动生成测试报告并邮件通知。 Grafana性能图表需测试人员实时监控…

加入MongoDB AI创新者计划,携手MongoDB共同开创AI新纪元

加入MongoDB AI创新者计划&#xff01; MongoDB对AI创新和初创企业的支持既全面又广泛&#xff01;无论您是领先的AI初创企业还是刚刚起步&#xff0c;MongoDB Atlas都是支持您愿景的最佳平台。 AI 初创者计划The AI Startup Track AI初创者计划为早期初创企业提供专属福利&…

云端漫步:搭建个人博客的移动云之旅

&#x1f482;作者简介&#xff1a; Thunder Wang&#xff0c;阿里云社区专家博主&#xff0c;华为云云享专家&#xff0c;腾讯云社区认证作者&#xff0c;CSDN SAP应用技术领域优质创作者。在学习工作中&#xff0c;我通常使用偏后端的开发语言ABAP&#xff0c;SQL进行任务的完…

dmanywhere的docker制作

dmanywhere的docker制作 官网地址&#xff1a; http://www.dmanywhere.cn/ 下载相关执行文件。 Dockerfile的默认命名是“Dockerfile”&#xff0c; 在构建镜像时&#xff0c;如果没有指定Dockerfile文件&#xff0c;Docker通常会寻找名为“Dockerfile”的文件 1.Dockerf…

6款网站登录页(附带源码)

6款网站登录页 效果图及部分源码123456 领取源码下期更新预报 效果图及部分源码 1 部分源码 <style>* {margin: 0;padding: 0;}html {height: 100%;}body {height: 100%;}.container {height: 100%;background-image: linear-gradient(to right, #fbc2eb, #a6c1ee);}.l…

搜索引擎的设计与实现(四)

目录 6 系统测试 6.1测试重要性 6.2测试用例 结 论 参 考 文 献 前面内容请移步 搜索引擎的设计与实现&#xff08;三&#xff09; 免费源代码&毕业设计论文 搜索引擎的设计与实现 6 系统测试 6.1测试重要性 该项目是在本地服务器上进行运行和调试&#xff0c;…

Spring6基础笔记

Spring6 Log4j2 1、概述 1.1、Spring是什么&#xff1f; Spring 是一款主流的 Java EE 轻量级开源框架 &#xff0c;Spring 由“Spring 之父”Rod Johnson 提出并创立&#xff0c;其目的是用于简化 Java 企业级应用的开发难度和开发周期。Spring的用途不仅限于服务器端的开发…

面试准备-八股【面试准备】

面试准备-八股【面试准备】 Java基础解决hash冲突的方法try catch finallyException与Error的包结构OOM你遇到过哪些情况&#xff0c;SOF你遇到过哪些情况线程有哪些基本状态?Java IO与 NIO的区别堆和栈的区别对象分配规则notify()和notifyAll()有什么区别&#xff1f;sleep()…

足球走地全自动化操作软件实现过程

本次采用selenium实现自动化操作的流程 打开浏览器录入账号密码等待数据请求&#xff08;监听&#xff09;有新数据&#xff0c;进行自动化操作通过homeName搜索&#xff0c;找到对应数据找到对应的类型&#xff08;让、大小…&#xff09;找到对应的盘口输入数量提交 附登录…

C#编程-.NET Framework使用工具类简化对象之间的属性复制和操作

在C#编程中&#xff0c;对象之间的属性复制和操作是一个常见的需求。为此&#xff0c;.NET Framework提供了多种实用工具库&#xff0c;如AutoMapper、ValueInjecter和ExpressMapper。这些库通过简化代码&#xff0c;提高了开发效率。本文将介绍这些工具库&#xff0c;比较它们…

《我的阿勒泰》观后感(一、什么叫做有用)

通过央视热播短剧《我的阿勒泰》&#xff0c;认识了李娟老师。同时也认识了她的作品&#xff0c;值得推荐。 生命并不荒凉&#xff0c;它是一种安静的绝美。 生活&#xff0c;如同一个巨大的迷宫&#xff0c;充满了未知和变数。有时&#xff0c;我们会在其中迷失方向&#xf…