深度学习设计模式之组合模式

文章目录

  • 前言
  • 一、介绍
  • 二、详细分析
    • 1.核心组成
    • 2.实现步骤
    • 3.代码示例
    • 4.优缺点
      • 优点
      • 缺点
    • 5.使用场景
  • 总结


前言

组合模式是将对象组合成树形结构来表现"整体/部分"层次结构,可以更好的实现管理操作。


一、介绍

组合设计模式又叫部分整体模式,将对象组合成树形结构来表现"整体/部分"层次结构,可以更好的实现管理操作。使用户可以通过一致的方法操作单个对象或组合对象,整体和部分的基本操作多数都是一样的,也会有不同的地方。组合模式可以用一棵树来表示。

二、详细分析

1.核心组成

  • 组合部件(Component):它是一个抽象接口,表示树根;
  • 合成部件(Composite):和组合部件类似,也有自己的子节点;
  • 叶子(Leaf):在组合中表示子节点对象,注意他是没有子节点。
    公司底下有部门,部门底下有职位。以下所示:
    在这里插入图片描述

2.实现步骤

  1. 创建组合部件,他是个抽象类,定义部件中的属性和方法;
  2. 创建合成部件,继承组合部件,创建集合属性,用来管理叶子节点;
  3. 创建叶子节点,继承组合部件,不能添加子节点。

3.代码示例

组合部件

/*** 组合部件*/
public abstract class Company {private String job;public Company(String job) {this.job = job;}public String getJob() {return job;}public void setJob(String job) {this.job = job;}/*** 添加职位*/protected abstract void addJob(Company company);/*** 删除职位*/protected abstract void removeJob(Company company);/*** 展示职位* @param depth 显示层级*/protected abstract void display(int depth);}

合成部件

/*** 合成部件*/
public class Department extends Company {List<Company> companyList = new ArrayList<Company>();public Department(String job) {super(job);}@Overrideprotected void addJob(Company company) {companyList.add(company);}@Overrideprotected void removeJob(Company company) {companyList.remove(company);}@Overrideprotected void display(int depth) {StringBuffer str= new StringBuffer();for (int i=0;i<depth;i++){str.append("-");}// 输出System.out.println(str.toString()+this.getJob());//子层级再加2for (Company company:companyList){company.display(depth+2);}}}

叶子节点

/*** 叶子节点*/
public class Job extends Company{public Job(String job) {super(job);}@Overrideprotected void addJob(Company company) {}@Overrideprotected void removeJob(Company company) {}@Overrideprotected void display(int depth) {StringBuffer str= new StringBuffer();for (int i=0;i<depth;i++){str.append("-");}// 输出System.out.println(str.toString()+this.getJob());}
}

测试类:

    public static void main(String[] args) {// 创建根Company company = new Department("北京公司");// 创建部门节点Company dept = new Department("软件开发部门");Company dept2 = new Department("软件测试部门");Company dept3 = new Department("产品部门");// 创建叶子节点并添加至部门Company job= new Job("软件开发经理");Company job1 = new Job("软件开发工程师");dept.addJob(job);dept.addJob(job1);Company job2 = new Job("软件测试工程师");dept2.addJob(job2);Company job3 = new Job("产品经理");dept3.addJob(job3);company.addJob(dept);company.addJob(dept2);company.addJob(dept3);company.display(0);}

结果
在这里插入图片描述

4.优缺点

优点

  • 组合模式定义了一组统一的接口,可以用来处理单个对象和组合对象,从而简化了客户端代码;
  • 组合模式使得可以很自然地将对象和它们的行为组织在一起,提高了代码的内聚性;
  • 新增加的叶节点类型或树枝节点类型可以无缝集成到现有系统中,无需修改现有代码;
  • 组合模式使得对象的添加和删除变得容易,因为它们可以统一地被添加到树形结构中。

缺点

  • 客户端需要花更更多时间理理清类之间的层次关系;
  • 组合模式要求所有叶子节点和树枝节点都实现相同的接口,这可能限制了对象的灵活性。

5.使用场景

  • 当想表达对象的部分-整体的层次结构,比如公司结构、菜单、文件夹等等;
  • 当我们的要处理的对象可以生成一颗树形结构,我们要对树上的节点和叶子进行操作时,它能够提供一致的方式,而不用考虑它是节点还是叶子。

总结

以上就是本篇的内容,本文简单介绍了组合模式的组成、优缺点、使用场景等,提供了代码示例。

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

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

相关文章

Kali : 安装Google Chrome 浏览器和ChromeDriver

目录 一、安装Google Chrome 浏览器 1、下载Google Chrome 2、安装Chrome 3、安装依赖包 二、安装ChromeDriver 1、查看Chrome版本 ​2、下载ChromeDriver 3、解压下载包 4、设置全局访问 5、赋予可执行权限 6、验证chromedriver 7、程序测试 一、安装Google Chrom…

【全开源】场馆预定系统源码(ThinkPHP+FastAdmin+UniApp)

一款基于ThinkPHPFastAdminUniApp开发的多场馆场地预定小程序&#xff0c;提供运动场馆运营解决方案&#xff0c;适用于体育馆、羽毛球馆、兵乒球馆、篮球馆、网球馆等场馆。 场馆预定系统源码&#xff1a;打造高效便捷的预定体验 一、引言&#xff1a;数字化预定时代的来临 …

【多态】(超级详细!)

【多态】&#xff08;超级详细&#xff01;&#xff09; 前言一、 多态的概念二、重写1. 方法重写的规则2. 重写和重载的区别 三、多态实现的条件四、 向上转型五、动态绑定 前言 面向对象的三大特征&#xff1a;封装性、继承性、多态性。 extends继承或者implements实现&…

基于物联网技术的智能家居实训教学解决方案

引言 随着信息技术的飞速发展&#xff0c;&#xff0c;物联网&#xff08;IoT&#xff09;已深入至我们生活的每一个角落&#xff0c;从智能家居、智能健康、智能交通到智慧城市&#xff0c;无所不在。物联网技术已成为推动社会进步和产业升级的重要力量。智能家居作为物联网技…

5位机械工程师如何共享一台服务器算力

在数字化浪潮的推动下&#xff0c;算力共享技术正逐渐成为机械工程师们提升工作效率、优化资源配置的重要工具。那么五位机械工程师如何共享一台服务器算力呢&#xff1f; 首先&#xff0c;我们需要了解算力共享的基本概念。算力共享是指通过特定的技术手段&#xff0c;将分散…

机器学习之支持向量机SVM

支持向量机 概念 是supported vector machine&#xff08;支持向量机&#xff09;&#xff0c;即寻找一个超平面使样本分成两类&#xff0c;且间隔最大分类 分类 硬间隔 若样本线性可分&#xff0c;且所有样本分类正确情况下&#xff0c;寻找最大间隔&#xff0c;即硬间隔 若…

计算机毕业设计 | springboot+vue汽车修理管理系统 汽修厂系统(附源码)

1&#xff0c;项目背景 在如今这个信息时代&#xff0c;“汽车维修管理系统” 这种维修方式已经为越来越多的人所接受。在这种背景之下&#xff0c;一个安全稳定并且强大的网络预约平台不可或缺&#xff0c;在这种成熟的市场需求的推动下&#xff0c;在先进的信息技术的支持下…

基于python实现的深度学习的车牌识别系统

基于python实现的深度学习的车牌识别系统 开发语言:Python 数据库&#xff1a;MySQL所用到的知识&#xff1a;Django框架工具&#xff1a;pycharm、Navicat、Maven 系统功能实现 登录页面 在车牌识别系统当中肯定是有登录的。怎么说呢&#xff0c;登录页面其实还是和最初的设…

提取Chrome中Cookie工具分享

用法 只需将站点输入即可。 SharpCookieMonster.exe [https://sitename.com] [chrome-debugging-port] [user data dir] 可选的第一个参数分隔chrome启动时最初连接的网站&#xff08;默认为https://www.google.com&#xff09;。 第二个可选参数指定用于启动chrome调试器的…

C++学习/复习7--泛型编程/函数模板/类模板

一、泛型编程 1.Swap()函数的模板实现 二、函数模板 1.概念 2.格式 3.实例化 &#xff08;1&#xff09;隐式与显示 注意事项&#xff1a;隐式与显示类型转换会产生临时变量&#xff0c;临时变量有常性&#xff0c;所以形参前加const 三、类模板 1.定义 2.例1 3.例2 4.注意事…

深入解析三层架构:构建稳定高效的软件系统

概述 顾名思义&#xff0c;三层架构分为三层&#xff0c;分别是“数据访问层”、“业务逻辑层”、“表示层”。 数据访问层&#xff1a;数据访问层在作业过程中访问数据系统中的文件&#xff0c; 实现对数据库中数据的读取保存操作。 表示层&#xff1a;主要功能是 显示数据和…

LeetCode刷题之HOT100之盛最多水的容器

狂风大作&#xff0c;降温了。下午提前把题目做了&#xff0c;上午做的最长回文子串还不是很能理解&#xff0c;慢慢理解吧&#xff0c;且看题 1、题目描述 2、逻辑分析 题目要求很清晰&#xff0c;我的思路就是暴力解法&#xff1a;枚举全部可能的情况&#xff08;两数不相等…

【Qt QML】Dialog组件

带有标准按钮和标题的弹出对话框&#xff0c;用于与用户进行短期交互。 这个描述指的是一个常见的用户界面元素&#xff0c;即一个临时弹出的窗口&#xff08;或对话框&#xff09;&#xff0c;它包含一个标题&#xff0c;显示对话框的用途或内容描述&#xff0c;以及一系列标…

[数据集][目标检测]航空发动机缺陷检测数据集VOC+YOLO格式291张4类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;291 标注数量(xml文件个数)&#xff1a;291 标注数量(txt文件个数)&#xff1a;291 标注类别…

Kyndryl 与 Nvidia 建立新的人工智能基础设施合作伙伴关系

Kyndryl与Nvidia宣布达成新的人工智能基础设施战略合作&#xff0c;共同推动AI技术的广泛应用。根据这一合作&#xff0c;Nvidia的先进AI软件解决方案将被引入Kyndryl的开放集成平台——Kyndryl Bridge&#xff0c;以优化基础设施工作负载&#xff0c;并为客户提供更高效的IT服…

AUS GLOBAL 与 UNICEF 联合国儿童基金会共同帮助叙利亚和土耳其地震受灾居民

2023年2月6日,土耳其东南部和叙利亚发生两次强烈地震和数十次余震,数以千计的儿童和家庭面临危机。 成千上万的房屋被毁,许多家庭被迫流离失所,而在一年中的这个时候,气温经常低于冰点,雪和冻雨很常见。许多学校、医院以及其他医疗和教育设施被地震破坏或摧毁,这对儿童造成了巨…

mongodb数据库备份到远程机器

一、背景 生产环境的mongodb数据库是直接购买阿里云的云数据库&#xff0c;但是在公司研发环境&#xff0c;我们是自己手动部署的。开发和测试的数据当然没有生产环境那么重要&#xff0c;但备份也是必要的&#xff0c;只不过容忍一定的数据丢失。 二、备份脚本 vi /etc/cro…

SpringCloud Alibaba Nacos分类配置--多方案配置隔离

文章目录 Nacos 分类配置(实现配置隔离)1.DataID 方案需求分析/图解配置实现测试 2.Group 方案需求分析/图解配置实现修改application.yml修改bootstrap.yml测试 3.Namespace 方案需求分析/图解配置实现修改application.yml修改bootstrap.yml测试 Namespace/Group/Data ID 关系…

MySQL连表查询练习

– 34. 查询所有员工的姓名和部门名称&#xff0c;没有部门的员工不需要展示 SELECTe.NAME 员工姓名,d.NAME 部门名称 FROMt_emp eINNER JOIN t_dept d ON e.dept_id d.id;– 35. 查询所有员工的姓名和部门名称&#xff0c;没有部门的员工展示BOSS SELECTe.NAME 员工姓名,i…

揭秘:如何使用Python统计女友生日还剩几天?

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言&#xff1a;为何需要统计生日天数&#xff1f; 二、需求分析与准备 1. 用户输入格…