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

文章目录

  • 组合模式简介
  • 结构
  • 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 编译结果:

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就不会全是文字那…

【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&#…

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

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

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

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

HCIP-Datacom-ARST自选题库__EBGP【18道题】

一、单选题 1.在排除EBGP邻居关系故障时&#xff0c;你发现两台直连设备使用Loopback口建立连接&#xff0c;故执行display current-configurationconfiguration bgp查看peer ebgp-max-hop hop-count的配置&#xff0c;下列哪项说法是正确的? hop-count必须大于2 hop-count…

8条黄金准则,解决API安全问题

API&#xff08;应用程序编程接口&#xff09;是现代软件开发中不可或缺的一部分。它们允许不同的应用程序之间共享数据和功能&#xff0c;从而促进了软件系统的整合和互操作性。然而&#xff0c;随着API使用的普及&#xff0c;安全性问题也开始浮出水面。 API安全是指保护API免…

Windows 剪映专业版 v5.9.0 解锁VIP、解除限制功能!

介绍 该脚本具备多项高级功能&#xff0c;包括人像抠图、会员专属模板、超清画质以及素材预设。会员可使用的功能均通过此脚本解锁。 解锁剪映软件会员功能&#xff0c;包括人像抠图、会员模板、超清画质以及素材预设等。 在标准操作流程中&#xff0c;用户首先在电脑端启动…

系统架构设计师【第12章】: 信息系统架构设计理论与实践 (核心总结)

文章目录 12.1 信息系统架构基本概念及发展12.1.1 信息系统架构的概述12.1.2 信息系统架构的发展12.1.3 信息系统架构的定义 12.2 信息系统架构12.2.1 架构风格12.2.2 信息系统架构分类12.2.3 信息系统架构的一般原理12.2.4 信息系统常用4种架构模型12.2.5 企业信息系…

大模型应用:Prompt-Engineering优化原则

1.Prompt-Engineering 随着大模型的出现及应用&#xff0c;出现了一门新兴“技术”&#xff0c;该技术被称为Prompt-Enginerring。Prompt Engineering即提示工程&#xff0c;是指在使用大语言模型时&#xff0c;编写高效、准确的Prompt(提示词)的过程。通过不同的表述、细节和…

【JavaEE 进阶(二)】Spring MVC(下)

❣博主主页: 33的博客❣ ▶️文章专栏分类:JavaEE◀️ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你了解更多进阶知识 目录 1.前言2.响应2.1返回静态界面2.2返回数据2.3返回HTML代码 3.综合练习3.1计算器3.2用户登…

ROS简介

ROS概念 学习路线 操作系统 Linux环境下编译执行c文件&#xff08;需安装vim超文本编辑器&#xff09; sudo g MyCoding.cpp -o CodeTest //生成一个名字为CodeTest的可执行文件 sudo ./CodeTest //执行c文件版本问题 ROS Melodic Morenia 和 ROS Noetic Ninjemys 是…

基于Django的博客系统之登录增加忘记密码(八)

需求 描述&#xff1a; 用户忘记密码时&#xff0c;提供一种重置密码的方法&#xff0c;以便重新获得账户访问权限。规划&#xff1a; 创建一个包含邮箱输入字段的表单&#xff0c;用于接收用户的重置密码请求。用户输入注册时使用的邮箱地址&#xff0c;系统发送包含重置密码…