结构型模式3.组合模式

结构型模式

  1. 适配器模式(Adapter Pattern)
  2. 桥接模式(Bridge Pattern)
  3. 组合模式(Composite Pattern)
  4. 装饰器模式(Decorator Pattern)
  5. 外观模式(Facade Pattern)
  6. 享元模式(Flyweight Pattern)
  7. 代理模式(Proxy Pattern)

组合模式(Composite Pattern) 是一种结构型设计模式,旨在将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得客户端可以统一对待单个对象和对象集合,即把对象当作单一对象来处理,从而简化了操作和使用的复杂性。

核心思想:

组合模式将对象组合成树形结构,并允许客户端通过统一的接口对待单一对象和对象组合。其本质是树形结构中的每个节点可能是单个对象,也可能是对象的组合(集合)。客户端通过同一接口处理这些对象,从而达到简化代码和增强灵活性的目的。

主要角色:

  1. Component(组件):定义了一个接口,声明了基本的操作(如 add()remove()getChild() 等),这使得单个对象和组合对象(即树枝)都能使用相同的操作。
  2. Leaf(叶子节点):表示树的叶子节点(即最基本的对象),没有子节点,实现了组件接口。
  3. Composite(组合节点):表示树的枝节点(即含有子节点的对象),实现了组件接口,并且能管理子组件。组合节点可以添加、删除和获取子组件。

示例:公司组织结构

假设我们有一个公司组织结构,其中有员工(叶子节点)和经理(组合节点),经理可以有下属员工或者其他经理。这种组织结构非常适合使用组合模式来实现。

// 组件接口
public interface Employee {void showDetails(); // 显示员工信息
}// 叶子节点,代表普通员工
public class RegularEmployee implements Employee {private String name;private String position;public RegularEmployee(String name, String position) {this.name = name;this.position = position;}@Overridepublic void showDetails() {System.out.println("姓名: " + name + ", 职位: " + position);}
}import java.util.ArrayList;
import java.util.List;// 组合节点,代表经理(可以包含员工或其他经理)
public class Manager implements Employee {private String name;private String position;private List<Employee> subordinates; // 下属public Manager(String name, String position) {this.name = name;this.position = position;subordinates = new ArrayList<>();}public void addSubordinate(Employee employee) {subordinates.add(employee);}public void removeSubordinate(Employee employee) {subordinates.remove(employee);}@Overridepublic void showDetails() {System.out.println("姓名: " + name + ", 职位: " + position);System.out.println("下属: ");for (Employee e : subordinates) {e.showDetails(); // 递归调用}}
}public class Client {public static void main(String[] args) {// 创建叶子节点(普通员工)Employee employee1 = new RegularEmployee("张三", "开发工程师");Employee employee2 = new RegularEmployee("李四", "设计师");// 创建组合节点(经理)Manager manager1 = new Manager("王五", "经理");Manager manager2 = new Manager("赵六", "高级经理");// 经理1有下属员工manager1.addSubordinate(employee1);manager1.addSubordinate(employee2);// 经理2有经理1作为下属manager2.addSubordinate(manager1);// 展示组织结构System.out.println("经理2的详细信息:");manager2.showDetails();}
}

解释:

  • Employee(组件):定义了一个接口,所有的员工都实现了这个接口,不管是普通员工还是经理。
  • RegularEmployee(叶子节点):普通员工,不能有下属,实现了 Employee 接口。
  • Manager(组合节点):经理有下属员工或者其他经理。它也实现了 Employee 接口,并且能够管理其他员工(包括普通员工和经理)。

在客户端代码中,ManagerRegularEmployee 都通过 Employee 接口处理,使用 showDetails() 方法递归地展示组织结构。无论是单一的普通员工,还是一个包含多个员工和经理的复杂结构,客户端都可以使用相同的接口来处理它们。

装饰器模式 vs 组合模式:

  • 装饰器模式:用来动态地向一个对象添加额外的功能,通常涉及一个对象及其装饰器对象的组合。
  • 组合模式:用来将对象组织成树形结构,表示“部分-整体”的关系,使得客户端可以统一对待单个对象和对象组合。

优缺点:

优点:
  1. 透明性:客户端不需要关心对象的组成细节,所有对象(包括单一对象和组合对象)都通过相同的接口进行操作。
  2. 灵活性:通过递归组合,可以构建出复杂的树形结构,同时提供统一的操作方法。
  3. 简化代码:对于复杂的层级结构,客户端不需要针对每一层次编写单独的处理代码,减少了重复代码。
缺点:
  1. 过度设计:如果对象本身没有复杂的层次结构,使用组合模式可能会显得过于复杂。
  2. 维护困难:在某些场景下,组合模式可能导致代码结构变得非常复杂,特别是当组合对象的层次较深时。

总结:

组合模式通过递归组合的方式,将对象和对象组合统一处理,使得在处理“部分-整体”结构时,客户端代码更加简洁。它适用于具有树形结构的场景,如文件系统、组织结构、菜单结构等。

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

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

相关文章

服务器攻击方式有哪几种?

随着互联网的快速发展&#xff0c;网络攻击事件频发&#xff0c;已泛滥成互联网行业的重病&#xff0c;受到了各个行业的关注与重视&#xff0c;因为它对网络安全乃至国家安全都形成了严重的威胁。面对复杂多样的网络攻击&#xff0c;想要有效防御就必须了解网络攻击的相关内容…

Transformer 中缩放点积注意力机制探讨:除以根号 dk 理由及其影响

Transformer 中缩放点积注意力机制的探讨 1. 引言 自2017年Transformer模型被提出以来&#xff0c;它迅速成为自然语言处理&#xff08;NLP&#xff09;领域的主流架构&#xff0c;并在各种任务中取得了卓越的表现。其核心组件之一是注意力机制&#xff0c;尤其是缩放点积注意…

Linux下部署SSM项目

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 Linux部署SSM项目 打包项目 1、修改pom.xml文件&#xff0c;打包方式改为war <packaging>war</packaging>2、idea 通过maven的clean&#xff0c;…

Bytebase 3.0.1 - 可配置在 SQL 编辑器执行 DDL/DML

&#x1f680; 新功能 新增环境策略&#xff0c;允许在 SQL 编辑器内直接执行 DDL/DML 语句。 支持为 BigQuery 数据脱敏。 在项目下新增数据访问控制及脱敏管理页面。 在数据库页面&#xff0c;支持回滚到变更历史的某个版本。 &#x1f514; 兼容性变更 禁止工单创建…

ansible 知识点【回顾梳理】

ansible 知识点 1. 剧本2. facts变量3. register变量4. include功能5. handlers6. when 条件7. with_items 循环8. Jinja2模板9. group_vars10. roles :star::star::star: 看起来字数很多&#xff0c;实际有很多是脚本执行结果&#xff0c;内容不多哦 1. 剧本 剧本很重要的就是…

LLM之RAG实战(五十一)| 使用python和Cypher解析PDF数据,并加载到Neo4j数据库

一、必备条件&#xff1a; python语言Neo4j数据库python库&#xff1a;neo4j、llmsherpa、glob、dotenv 二、代码&#xff1a; from llmsherpa.readers import LayoutPDFReaderfrom neo4j import GraphDatabaseimport uuidimport hashlibimport osimport globfrom datetime …

MLU上使用MagicMind GFPGANv1.4 onnx加速!

文章目录 前言一、平台环境准备二、环境准备1.GFPGAN代码处理2.MagicMind转换修改env.sh修改run.sh参数解析运行 3.修改后模型运行 前言 MagicMind是面向寒武纪MLU的推理加速引擎。MagicMind能将人工智能框架&#xff08;TensorFlow、PyTorch、Caffe与ONNX等&#xff09;训练好…

关于大数据的基础知识(一)——定义特征结构要素

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///计算机爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于大数据的基础知识&#xff08;一&a…

音视频入门基础:MPEG2-PS专题(5)——FFmpeg源码中,解析PS流中的PES流的实现

音视频入门基础&#xff1a;MPEG2-PS专题系列文章&#xff1a; 音视频入门基础&#xff1a;MPEG2-PS专题&#xff08;1&#xff09;——MPEG2-PS官方文档下载 音视频入门基础&#xff1a;MPEG2-PS专题&#xff08;2&#xff09;——使用FFmpeg命令生成ps文件 音视频入门基础…

国标GB28181-2022视频平台EasyGBS小知识:局域网ip地址不够用怎么解决?

在局域网中&#xff0c;IP地址不足的问题通常不会在小型网络中出现&#xff0c;但在拥有超过255台设备的大型局域网中&#xff0c;就需要考虑如何解决IP地址不够用的问题了。 在企业局域网中&#xff0c;经常会出现私有IP地址如192.168.1.x到192.168.1.255不够用的情况。由于0…

spring boot启动源码分析(三)之Environment准备

上一篇《spring-boot启动源码分析&#xff08;二&#xff09;之SpringApplicationRunListener》 环境介绍&#xff1a; spring boot版本&#xff1a;2.7.18 主要starter:spring-boot-starter-web 本篇开始讲启动过程中Environment环境准备&#xff0c;Environment是管理所有…

springmvc前端传参,后端接收

RequestMapping注解 Target({ElementType.METHOD, ElementType.TYPE}) Retention(RetentionPolicy.RUNTIME) Documented Mapping public interface RequestMapping {String name() default "";AliasFor("path")String[] value() default {};AliasFor(&quo…

【Excel/WPS】根据平均值,生成两列/多列指定范围的随机数/随机凑出两列数据

原理就是通过随机生成函数和平均值函数。 适用场景&#xff1a;在总体打分后&#xff0c;需要在小项中随机生成小分数 第一列&#xff1a;固定的平均值A2第二列&#xff1a; RANDBETWEEN(A2-10,A210)第三列&#xff1a;根据第二列用平均值函数算除 A2*2-B2这是随机值1的公式&am…

运动相机拍摄的视频打不开怎么办

3-10 GoPro和大疆DJI运动相机的特点&#xff0c;小巧、高清、续航长、拍摄稳定&#xff0c;很多人会在一些重要场合用来拍摄视频&#xff0c;比如可以用来拿在手里拍摄快速运动中的人等等。 但是毕竟是电子产品&#xff0c;有时候是会出点问题的&#xff0c;比如意外断电、摔重…

智能化文档开发(DI)

这个文档涉及到多模态&#xff08;文本、发票、订单、语音&#xff09; 对于普通的文本&#xff0c;我们希望对某些实体的某些属性挖空生成文档模版&#xff0c;并根据预设字段填空最后生成正式文件对于发票、订单&#xff0c;我们想提取它的字段信息&#xff0c;写入DB对于一些…

【轻松学C:编程小白的大冒险】--- C语言简介 02

在编程的艺术世界里&#xff0c;代码和灵感需要寻找到最佳的交融点&#xff0c;才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里&#xff0c;我们将共同追寻这种完美结合&#xff0c;为未来的世界留下属于我们的独特印记。 【轻松学C&#xff1a;编程小白的大冒险】…

零基础 监控数据可视化 Spring Boot 2.x(Actuator + Prometheus + Grafana手把手) (上)

一、安装Prometheus Releases prometheus/prometheus GitHubhttps://github.com/prometheus/prometheus/releases 或 https://prometheus.io/download/https://prometheus.io/download/ 1. 下载适用于 Windows 的二进制文件&#xff1a; 找到最新版本的发布页面&#xf…

Idea日志乱码

问题描述 前提&#xff1a;本人使用windows Idea运行sh文件&#xff0c;指定了utf-8编码&#xff0c;但是运行过程中还是存在中文乱码 Idea的相关配置都已经调整 字体调整为雅黑 文件编码均调整为UTF-8 调整Idea配置文件 但是还是存在乱码&#xff0c;既然Idea相关配置已经…

MySQL 数据表与索引设计艺术:打造高效数据存取架构

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《MySQL技术精粹》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、什么是MySQL 2、MySQL适用场景 二、MySQL的数据存储与检索 1、数据表…

安卓硬件加速hwui

安卓硬件加速 本文基于安卓11。 从 Android 3.0 (API 级别 11) 开始&#xff0c;Android 2D 渲染管道支持硬件加速&#xff0c;这意味着在 View 的画布上执行的所有绘图操作都使用 GPU。由于启用硬件加速所需的资源增加&#xff0c;你的应用程序将消耗更多内存。 软件绘制&am…