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

文章目录

  • 前言
  • 一、介绍
  • 二、详细分析
    • 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…

Qt | QTabWidget 类(选项卡部件)

01、上节回顾 Qt | QTabBar 类(选项卡栏)02、简介 1、QTabWidget 类直接继承自 QWidget。该类提供了一个选项卡栏(QTabBar)和一个相应的页面区域,用于显示与每个选项卡相对应的页面。与 QStackedLayout 布局原理相同,只有当前页面(即可见页面)是可见的,所有其他页面都不可见…

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

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

【多态】(超级详细!)

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

【优选算法】(1)移动零

题目&#xff1a; . - 力扣&#xff08;LeetCode&#xff09; 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0…

【sass数字运算简介以及使用方法】

Sass&#xff08;Syntactically Awesome Stylesheets&#xff09;是一种CSS预处理器&#xff0c;它允许你使用变量、嵌套规则、混合&#xff08;mixin&#xff09;、函数等特性来编写CSS&#xff0c;然后将其编译成普通的CSS代码。Sass中的数字运算是一个强大的功能&#xff0c…

Lambada表示式

Lambada Lambda表达式是Java中的一个重要特性&#xff0c;用于简化函数式编程。它提供了一种更简洁的方式来编写匿名函数&#xff0c;可以被赋值给一个变量&#xff0c;或者作为参数传递给其他方法。 Lambda表达式的基本语法如下&#xff1a; (parameter1, parameter2, .…

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

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

生成式对抗算法

生成式对抗算法,通常被称为GAN(Generative Adversarial Networks,生成式对抗网络),是深度学习在图像生成方面的重要应用。生成式对抗算法是一种强大的深度学习技术,它能够在无监督学习的环境下生成高质量的数据,为多个领域的应用提供了可能性。然而,由于其训练过程相对…

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

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

探索Web前端三大主流框架:Angular、React和Vue.js

在现代Web开发中&#xff0c;前端框架的选择对于项目的成功至关重要。Angular、React和Vue.js作为三大主流前端框架&#xff0c;各自拥有独特的特点和优势&#xff0c;本文将对它们进行详细的探索和比较。 1. Angular Angular是由Google开发和维护的一款开源前端框架&#xf…

etcd学习笔记-未完成整理

博客参考&#xff1a;K8s组件&#xff1a;etcd安装、使用及原理&#xff08;Linux&#xff09; 原理&#xff1a;分布式系统架构中对一致性要求很高&#xff0c;etcd就满足了分布式系统中的一致性要求。实现了分布式一致性键值对存储的中间件。设计用来可靠而快速的保存关键数…

机器学习之支持向量机SVM

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

Python中的设计模式:常见问题的永恒解决方案

在软件开发这片日新月异的领域里&#xff0c;Python 以其简洁与多用途性脱颖而出&#xff0c;成为领航语言。面对技术的不断变革&#xff0c;一些挑战却恒久不变。设计模式&#xff0c;作为这些问题的成熟解决方案&#xff0c;为高效编程提供了一个至关重要的工具箱。本文将深入…

论文精读:TASKBENCH: BENCHMARKING LARGE LANGUAGE MODELS FOR TASK AUTOMATION

Author: Dongsheng Li, Kaitao Song, Kan Ren, Siyu Yuan, Weiming Lu, Wenqi Zhang, Xu Tan, Yongliang Shen, Yueting Zhuang Institution: 复旦大学(Fudan University), 微软亚洲研究院(Microsoft Research Asia), 浙江大学(Zhejiang University) Summary: LLM 带动了…

计算机毕业设计 | 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#调用示例

发票对于个人来说是重要的报销依据&#xff0c;一旦丢失就不能用之报销。对于公司来说&#xff0c;发票是公司做账不可缺少的一部分&#xff0c;相信每位财务人员都会小心存放发票。可世界之大&#xff0c;任何事情都会发生&#xff0c;收到假发票入账的情况在企业当中也时常发…

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

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