设计模式(七)结构型模式---组合模式

文章目录

  • 组合模式简介
  • 结构
  • UML图
  • 具体实现
    • UML图
    • 代码实现

组合模式简介

  • 组合模式(Composite Pattern)又叫整体模式,它创建了对象组的树形结构,将对象组合成树状结构来表示“整体-部分”的层次关系。
  • 实际使用点:HashMap中构造函数,有可以添加整个集合的构造,就是组合模式。

结构

  • 1.Component:抽象根节点,定义系统各层次对象的共有方法和属性,用于访问和管理Component子部件,Component可以是抽象类或者接口。
  • 2.Composite:非叶子节点,用来存储子部件,实现了Component结构,并用 组合 关系 组合Component对象,一般用来增加(add)、删除(delete)
  • 3.Leaf:叶子节点,叶子节点没有子节点。

UML图

在这里插入图片描述

具体实现

例子:一个学校(University)有多个学院(College),一个学院有多个专业(Department),输出这个学校的树形结构。

UML图

在这里插入图片描述

代码实现

  • 抽象根节点
package com.xxliao.pattern.structure.composite.demo;/*** @author xxliao* @description: 组合模式的 抽象根节点* @date 2024/5/25 13:42*/
public abstract class OrganizationComponent {private String name;private String desc;public OrganizationComponent(String name, String desc) {this.name = name;this.desc = desc;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getDesc() {return desc;}public void setDesc(String desc) {this.desc = desc;}/*** @description  add* @author  xxliao* @date  2024/5/25 13:45*/public void add(OrganizationComponent organizationComponent) {// 抽象根节点不能添加throw new UnsupportedOperationException();}/*** @description  delete* @author  xxliao* @date  2024/5/25 13:45*/public void delete(OrganizationComponent organizationComponent) {// 抽象根节点不能添加throw new UnsupportedOperationException();}/*** @description  print* @author  xxliao* @date  2024/5/25 13:46*/public abstract void print();
}
  • 非叶子节点
package com.xxliao.pattern.structure.composite.demo;import java.util.ArrayList;
import java.util.List;/*** @author xxliao* @description: Composite 类 ,大学类 可以管理 College类* @date 2024/5/25 13:48*/
public class University extends OrganizationComponent{// 子节点集合 ,采用组合关系 集成了 OrganizationComponent抽象根节点private List<OrganizationComponent> organizationComponents = new ArrayList<OrganizationComponent>();public University(String name, String desc) {super(name, desc);}@Overridepublic String getName() {return super.getName();}@Overridepublic String getDesc() {return super.getDesc();}@Overridepublic void add(OrganizationComponent organizationComponent) {organizationComponents.add(organizationComponent);}@Overridepublic void delete(OrganizationComponent organizationComponent) {organizationComponents.remove(organizationComponent);}@Overridepublic void print() {System.out.println("=================="+getName()+"=================");for (OrganizationComponent organizationComponent : organizationComponents) {organizationComponent.print();}}
}
package com.xxliao.pattern.structure.composite.demo;import java.util.ArrayList;
import java.util.List;/*** @author xxliao* @description: Composite 类 ,学院类 可以管理 Department类* @date 2024/5/25 13:48*/
public class College extends OrganizationComponent{// 子节点集合 ,采用组合关系 集成了 OrganizationComponent抽象根节点private List<OrganizationComponent> organizationComponents = new ArrayList<OrganizationComponent>();public College(String name, String desc) {super(name, desc);}@Overridepublic String getName() {return super.getName();}@Overridepublic String getDesc() {return super.getDesc();}@Overridepublic void add(OrganizationComponent organizationComponent) {organizationComponents.add(organizationComponent);}@Overridepublic void delete(OrganizationComponent organizationComponent) {organizationComponents.remove(organizationComponent);}@Overridepublic void print() {System.out.println("=================="+getName()+"=================");for (OrganizationComponent organizationComponent : organizationComponents) {organizationComponent.print();}}
}
  • 叶子节点
package com.xxliao.pattern.structure.composite.demo;/*** @author xxliao* @description: leaf 类 ,子节点类* @date 2024/5/25 13:48*/
public class Department extends OrganizationComponent{public Department(String name, String desc) {super(name, desc);}@Overridepublic String getName() {return super.getName();}@Overridepublic String getDesc() {return super.getDesc();}@Overridepublic void print() {System.out.println(getName());}}
  • 测试客户端
package com.xxliao.pattern.structure.composite.demo;/*** @author xxliao* @description: 组合模式 测试客户端* @date 2024/5/25 13:57*/
public class Client {public static void main(String[] args) {// 创建大学OrganizationComponent university = new University("xxliao大学", "TOP1");// 创建学院OrganizationComponent computer = new College("计算机学院", "计算机学院");OrganizationComponent finance = new College("经济管理学院", "经管学院");// 将学院添加到大学中university.add(computer);university.add(finance);//创建专业computer.add(new Department("计算机科学与技术","计算机科学与技术"));computer.add(new Department("软件工程","软件工程"));computer.add(new Department("网络工程","网络工程"));finance.add(new Department("经济学","经济学"));finance.add(new Department("国际金融与贸易","国际金融与贸易"));// 打印整个大学结构university.print();}
}
  • 测试结果
    在这里插入图片描述

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

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

相关文章

Day04 左侧菜单导航实现

一.点击左侧菜单导航到对应的View页面 1.首先在MyToDo项目中,创建出左侧菜单所有的View(视图)及对应的ViewModel(视图逻辑处理类) ViewViewModel首页IndexViewIndexViewModel待办事项ToDoViewToDoViewModel忘备录MemoViewMemoViewModel设置SettingsViewSettingsViewModel

html+CSS+js部分基础运用11

一、改变新闻网页中的字号 1、设计如图1-1所示的界面&#xff0c;要求当网络访问者选择字号中的【大、中、小】时能实现页面字号大小变化&#xff0c;选择“中”时&#xff0c;页面效果如图1所示。 图1 单击前初始状态页面 图2 单击“中”链接后页面 2、div中内容如下&#x…

十大排序 —— 归并排序

十大排序 —— 归并排序 归并排序分治(排序)合归并排序的性能一些小总结 我们今天继续来学习排序算法 —— 归并排序: 归并排序 归并排序&#xff08;Merge Sort&#xff09;是一种高效的、稳定的排序算法&#xff0c;它采用分治法&#xff08;Divide and Conquer&#xff09…

杂项——STM32ZET6要注意的一些问题——高级定时器问题和PB3,PB4引脚问题

ZET6可能会用到定时器&#xff0c;高级定时器要输出PWM要加上这样一行代码&#xff0c;否则无法正常输出PWM波 TIM_CtrlPWMOutputs(TIM8, ENABLE); // 主输出使能&#xff0c;当使用的是通用定时器时&#xff0c;这句不需要 ZET6中PB3,PB4引脚默认功能是JTDO和NJTRST,如果想将…

六一和侄子拼lego颗粒二维画

一、从泥巴到高科技&#xff1a;儿时玩具的变迁 在我童年的记忆里&#xff0c;最快乐的时光往往与简单的玩具和泥巴有关。在那个没有智能手机和电子游戏的年代&#xff0c;泥巴是我们的乐园&#xff0c;而玩具则是我们的伴侣。 小时候&#xff0c;泥巴是我们的创造力的源泉。…

Go跨平台编译

1.编译windows平台运行程序 # windows env GOOSwindows GOARCHamd64 go build main.go2.编译linux平台运行程序 # linux env GOOSlinux GOARCHamd64 go build main.go 3.编译macos平台运行程序 # macos env GOOSdarwin GOARCHamd64 go build main.go 编译结果:

Kubernetes资源对象分类

目录 一、工作负载资源方面 二、Service资源 三、配置和存储资源 四、身份认证资源 五、鉴权资源 六、策略资源 七、集群资源 八、扩展资源 一、工作负载资源方面 Pod 是在主机上运行的容器的集合。 PodTemplate 描述一种模板&#xff0c;用来为预定义的 Pod 生成副本…

Python3 match-case 语句

前言 本文主要介绍match-case语句与switch-case的区别&#xff0c;及match-case语句的基本用法。 文章目录 前言一、switch-case 和match-case的区别二、match-case的基本用法1、可匹配的数据类型2、多条件匹配3、通配符匹配 一、switch-case 和match-case的区别 C语言里面s…

Git操作笔记

学git已经好多次了。但是还是会忘记很多的东西&#xff0c;一些常用的操作命令和遇到的bug以后在这边记录汇总下 一.github图片展示 图片挂载&#xff0c;我是创建了一个库专门存图片&#xff0c;然后在github的md中用专用命令展示图片&#xff0c;这样你的md就不会全是文字那…

短信负载均衡

基本流程 String loadBalancersName loadBalancers.get(loadBalancerType); SendLoadBalancer sendLoadBalancer registerBeanHandler.getBean(loadBalancersName, SendLoadBalancer.class); String channelLabel sendLoadBalancer.chooseChannel(smsTemplateVOs,mobiles);…

MyEclipse 新手使用教程

MyEclipse 是一款功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;基于 Eclipse 平台&#xff0c;专为 Java 开发设计&#xff0c;特别适合企业级应用开发。它集成了各种开发工具和插件&#xff0c;支持多种编程语言和框架&#xff0c;包括 Java EE、Spring、Hi…

【Redis延迟队列】redis中的阻塞队列和延迟队列

阻塞队列&#xff08;RBlockingQueue&#xff09; 作用和特点&#xff1a; 实时性&#xff1a;阻塞队列用于实时处理消息。生产者将消息放入队列&#xff0c;消费者可以立即从队列中取出并处理消息。阻塞特性&#xff1a;如果队列为空&#xff0c;消费者在尝试获取消息时会被…

【C语言】文件操作(中卷)

前言 在文件操作&#xff08;上卷&#xff09;中&#xff0c;讲到的主要都是正式文件操作开始之前的前置知识&#xff0c;而这一卷中&#xff0c;我们将开始正式地操作文件。 在上卷中我们已经说到&#xff0c;stdin stdout stderr是三个C语言程序启动时默认打开的流。这三个流…

HarmonyOS应用开发学习历程(1)初识DevEco Studio

1.create project Bundle name&#xff1a;包名&#xff0c;标识应用程序&#xff0c;默认应用ID也使用该名 Compile SDK&#xff1a;编译时API版本 2.工程目录 AppScope&#xff1a;应用全局所需资源 entry&#xff1a;应用的主模块&#xff0c;含代码、资源 hvigor&#…

C语言编程实现年增长率的计算:深入探讨与实际应用

C语言编程实现年增长率的计算&#xff1a;深入探讨与实际应用 在数据分析和商业领域中&#xff0c;年增长率是一个至关重要的指标&#xff0c;它能够帮助我们了解某个指标在一定时间内的变化趋势。在C语言编程中&#xff0c;我们同样可以通过编写相应的程序来计算年增长率。本…

TimeDao-一篇文章了解清楚Subspace项目

1 项目简介 什么是Subspace网络&#xff1f; Subspace是为下一波加密创建者构建的第四代区块链。旨在实现web3规模扩容。 Subspace允许开发者以互联网规模运行 Web3 应用。它提供了一个简单的接口&#xff0c;用于快速部署按需求自动扩展的多链去中心化应用。Subspace由一个…

【C++】6-8 你好,自定义类型的输入输出

6-8 你好&#xff0c;自定义类型的输入输出 分数 15 全屏浏览 切换布局 作者 向训文 单位 惠州学院 完善程序&#xff0c;使程序正确运行&#xff1a; Student类为Person类的派生类 裁判测试程序样例&#xff1a; #include <iostream> #include <string> us…

微积分归纳总结:中值定理(大全包括函数、微分、积分)

微积分归纳总结&#xff1a;中值定理 关于连续函数的中值定理 函数连续则有一下中值定理 名称内容证明有界与最值闭区间的连续函数在该区间上有界并一定有最大值和最小值同济的高数书上证明从略零点定理若函数 f ( x ) f(x) f(x)在闭区间 [ a , b ] [a,b] [a,b]上连续&#…

Python实例:Excel表格内容行列转置

原文链接&#xff1a;http://www.juzicode.com/python-example-excel-col-row-transpose 今天的例子实现对Excel表格的行列值完成转置。 原始表格为:A | B | C 1 | 2 | 3 * | ( | ) 经过转置后变为&#xff1a;A | 1 | *B | 2 | (C | 3 | )方法1&#xff0c;用xlrd读取excel文…

神经网络与深度学习——第7章 网络优化与正则化

本文讨论的内容参考自《神经网络与深度学习》https://nndl.github.io/ 第7章 网络优化与正则化 网络优化与正则化 网络优化 网络结构多样性 高维变量的非凸优化 神经网络优化的改善方法 优化算法 小批量梯度下降 批量大小选择 学习率调整 学习率衰减 学习率预热 周期性学习率调…