当前位置: 首页 > news >正文

SCAU软件体系结构实验四 组合模式

目录

一、题目

 二、源码


一、题目

个人(Person)与团队(Team)可以形成一个组织(Organization):组织有两种:个人组织和团队组织,多个个人可以组合成一个团队,不同的个人与团队可以组合成一个更大的团队。

使用控制台或者JavaFx界面完成以下功能:维护团队,并递归显示团队的所以成员。

控制台客户端功能提示:简化起见,采用自顶向下的方式创建团队,例如,创建“t1”团队,然后创建“t1”的子团队“t1.1”团队、“t1.2”团队,创建“t1.1”的子团队“t1.1.1”,子团队“t1.1.1”由“p1”、“p2”和“p3”三个人。创建完成后,递归输出这些对象;例如,当前情况下输出这样的消息:

团队t1有t1.1, t1.2, t1.3三个子对象;团队t1.1有t1.1.1一个子对象;团队t1.1.1有p1, p2, p3三个子对象。

在此基础上修改一个对象,例如,把p3对象从子团队“t1.1.1”中删除,然后添加到t1.1团队中;完成这些操作后,递归输出这些对象,结果应该是

团队t1有t1.1, t1.2, t1.3三个子对象;团队t1.1有p3, t1.1.1两个子对象;团队t1.1.1有p1, p2两个子对象。

JavaFx界面提示:JavaFx的基本界面如下,同学们在此基础上适当修改.

左边是创建对象的树状结构展示,右边是选中某一个节点后的操作。例如,如果选中T12。然后就可以输入T121,输入后直接刷新树状结构。

 二、源码

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;public class OrganizationManager {static class Person {private String name;public Person(String name) {this.name = name;}public String getName() {return name;}@Overridepublic boolean equals(Object obj) {if (this == obj) return true;if (obj == null || getClass() != obj.getClass()) return false;Person person = (Person) obj;return name.equals(person.name);}@Overridepublic int hashCode() {return name.hashCode();}@Overridepublic String toString() {return name;}}static class Team {private String name;private List<Team> subTeams = new ArrayList<>();private List<Person> members = new ArrayList<>();public Team(String name) {this.name = name;}public String getName() {return name;}public void addSubTeam(Team team) {subTeams.add(team);}public void addMember(Person person) {members.add(person);}public boolean removeMember(Person person) {return members.remove(person);}public void moveMember(Person person, Team destination) {if (removeMember(person)) {destination.addMember(person);} else {System.out.println("成员 " + person + " 不在团队 " + this.name + " 中。");}}public Team findSubTeam(String name) {for (Team subTeam : subTeams) {if (subTeam.getName().equals(name)) {return subTeam;}}for (Team subTeam : subTeams) {Team found = subTeam.findSubTeam(name);if (found != null) {return found;}}return null;}public Person findMember(String name) {for (Person member : members) {if (member.getName().equals(name)) {return member;}}for (Team subTeam : subTeams) {Person found = subTeam.findMember(name);if (found != null) {return found;}}return null;}public void display(int level) {System.out.println(getIndent(level) + "团队" + name + "有" + subTeams.size() + "个子团队;");for (Team subTeam : subTeams) {subTeam.display(level + 1);}System.out.println(getIndent(level) + "团队" + name + "有" + members.size() + "个成员;");for (Person member : members) {System.out.println(getIndent(level + 1) + member);}}private String getIndent(int level) {return "    ".repeat(level);}}public static void main(String[] args) {Team t1 = new Team("t1");Team t1_1 = new Team("t1.1");Team t1_2 = new Team("t1.2");Team t1_1_1 = new Team("t1.1.1");Person p1 = new Person("p1");Person p2 = new Person("p2");Person p3 = new Person("p3");t1.addSubTeam(t1_1);t1.addSubTeam(t1_2);t1_1.addSubTeam(t1_1_1);t1_1_1.addMember(p1);t1_1_1.addMember(p2);t1_1_1.addMember(p3);Scanner scanner = new Scanner(System.in);while (true) {System.out.println("\n请选择操作:");System.out.println("1. 显示团队结构");System.out.println("2. 删除成员");System.out.println("3. 移动成员");System.out.println("4. 退出");String choice = scanner.nextLine();switch (choice) {case "1":t1.display(0);break;case "2":System.out.println("请输入要删除的成员名称:");String memberNameToDelete = scanner.nextLine();Person memberToDelete = t1.findMember(memberNameToDelete);if (memberToDelete != null) {Team teamToDelete = findTeamForMember(t1, memberToDelete);if (teamToDelete != null) {teamToDelete.removeMember(memberToDelete);System.out.println("成员 " + memberNameToDelete + " 已删除。");} else {System.out.println("未找到该成员所在的团队。");}} else {System.out.println("未找到该成员。");}break;case "3":System.out.println("请输入要移动的成员名称:");String memberNameToMove = scanner.nextLine();System.out.println("请输入目标团队名称:");String targetTeamName = scanner.nextLine();Person memberToMove = t1.findMember(memberNameToMove);Team targetTeam = t1.findSubTeam(targetTeamName);if (memberToMove != null && targetTeam != null) {Team currentTeam = findTeamForMember(t1, memberToMove);if (currentTeam != null) {currentTeam.moveMember(memberToMove, targetTeam);System.out.println("成员 " + memberNameToMove + " 已移动到团队 " + targetTeamName + "。");} else {System.out.println("未找到该成员所在的团队。");}} else {System.out.println("未找到指定的成员或目标团队。");}break;case "4":scanner.close();return;default:System.out.println("无效的操作。");break;}}}private static Team findTeamForMember(Team root, Person member) {for (Person m : root.members) {if (m.equals(member)) {return root;}}for (Team subTeam : root.subTeams) {Team found = findTeamForMember(subTeam, member);if (found != null) {return found;}}return null;}
}

相关文章:

SCAU软件体系结构实验四 组合模式

目录 一、题目 二、源码 一、题目 个人(Person)与团队(Team)可以形成一个组织(Organization)&#xff1a;组织有两种&#xff1a;个人组织和团队组织&#xff0c;多个个人可以组合成一个团队&#xff0c;不同的个人与团队可以组合成一个更大的团队。 使用控制台或者JavaFx界面…...

Amazon商品详情API接口:电商创新与用户体验的驱动力

在电子商务蓬勃发展的今天&#xff0c;作为全球最大的电商平台之一&#xff0c;亚马逊&#xff08;Amazon&#xff09;凭借其强大的技术实力和丰富的商品资源&#xff0c;为全球用户提供了优质的购物体验。其中&#xff0c;Amazon商品详情API接口在电商创新与用户体验提升方面扮…...

手机无法连接服务器1302什么意思?

你有没有遇到过手机无法连接服务器&#xff0c;屏幕上显示“1302”这样的错误代码&#xff1f;尤其是在急需使用手机进行工作或联系朋友时&#xff0c;突然出现的连接问题无疑会带来不少麻烦。那么&#xff0c;什么是1302错误&#xff0c;它又意味着什么呢&#xff1f; 1302错…...

Android adb shell dumpsys audio 信息查看分析详解

Android adb shell dumpsys audio 信息查看分析详解 一、前言 Android 如果要分析当前设备的声音通道相关日志&#xff0c; 仅仅看AudioService的日志是看不到啥日志的&#xff0c;但是看整个audio关键字的日志又太多太乱了&#xff0c; 所以可以看一下系统提供的一个调试指令…...

Python 网络爬虫操作指南

网络爬虫是自动化获取互联网上信息的一种工具。它广泛应用于数据采集、分析以及实现信息聚合等众多领域。本文将为你提供一个完整的Python网络爬虫操作指南&#xff0c;帮助你从零开始学习并实现简单的网络爬虫。我们将涵盖基本的爬虫概念、Python环境配置、常用库介绍。 上传…...

基于FPGA的2FSK调制-串口收发-带tb仿真文件-实际上板验证成功

基于FPGA的2FSK调制 前言一、2FSK储备知识二、代码分析1.模块分析2.波形分析 总结 前言 设计实现连续相位 2FSK 调制器&#xff0c;2FSK 的两个频率为:fI15KHz&#xff0c;f23KHz&#xff0c;波特率为 1500 bps,比特0映射为f 载波&#xff0c;比特1映射为 载波。 1&#xff09…...

JavaScript的基础数据类型

一、JavaScript中的数组 定义 数组是一种特殊的对象&#xff0c;用于存储多个值。在JavaScript中&#xff0c;数组可以包含不同的数据类型&#xff0c;如数字、字符串、对象、甚至其他数组。数组的创建有两种常见方式&#xff1a; 字面量表示法&#xff1a;let fruits [apple…...

第三讲 架构详解:“隐语”可信隐私计算开源框架

目录 隐语架构 隐语架构拆解 产品层 算法层 计算层 资源层 互联互通 跨域管控 本文主要是记录参加隐语开源社区推出的第四期隐私计算实训营学习到的相关内容。 隐语架构 隐语架构拆解 产品层 产品定位&#xff1a; 通过可视化产品&#xff0c;降低终端用户的体验和演…...

JDBC编程---Java

目录 一、数据库编程的前置 二、Java的数据库编程----JDBC 1.概念 2.JDBC编程的优点 三.导入MySQL驱动包 四、JDBC编程的实战 1.创造数据源&#xff0c;并设置数据库所在的位置&#xff0c;三条固定写法 2.建立和数据库服务器之间的连接&#xff0c;连接好了后&#xff…...

Python绘制太极八卦

文章目录 系列目录写在前面技术需求1. 图形绘制库的支持2. 图形绘制功能3. 参数化设计4. 绘制控制5. 数据处理6. 用户界面 完整代码代码分析1. rset() 函数2. offset() 函数3. taiji() 函数4. bagua() 函数5. 绘制过程6. 技术亮点 写在后面 系列目录 序号直达链接爱心系列1Pyth…...

Spring框架特性及包下载(Java EE 学习笔记04)

1 Spring 5的新特性 Spring 5是Spring当前最新的版本&#xff0c;与历史版本对比&#xff0c;Spring 5对Spring核心框架进行了修订和更新&#xff0c;增加了很多新特性&#xff0c;如支持响应式编程等。 更新JDK基线 因为Spring 5代码库运行于JDK 8之上&#xff0c;所以Spri…...

Linux关于vim的笔记

Linux关于vim的笔记&#xff1a;(vimtutor打开vim 教程) --------------------------------------------------------------------------------------------------------------------------------- 1. 光标在屏幕文本中的移动既可以用箭头键&#xff0c;也可以使用 hjkl 字母键…...

linux mount nfs开机自动挂载远程目录

要在Linux系统中实现开机自动挂载NFS共享目录&#xff0c;你需要编辑/etc/fstab文件。以下是具体步骤和示例&#xff1a; 确保你的系统已经安装了NFS客户端。如果没有安装&#xff0c;可以使用以下命令安装&#xff1a; sudo apt-install nfs-common 编辑/etc/fstab文件&#…...

【vue】导航守卫

什么是导航守卫 在vue路由切换过程中对行为做个限制 全局前置守卫 route.beforeEach((to, from, next)) > {// to是切换到的路由// from是正要离开的路由// next控制是否允许进入目标路由next(false); //不允许 }路由级别的导航守卫 const routes [{path: /User,name: U…...

基于Matlab实现LDPC编码

在无线通信和数据存储领域&#xff0c;LDPC&#xff08;低密度奇偶校验码&#xff09;编码是一种高效、纠错能力强大的错误校正技术。本MATLAB仿真程序全面地展示了如何在AWGN&#xff08;加性高斯白噪声&#xff09;信道下应用LDPC编码与BPSK&#xff08;二进制相移键控&#…...

PostgreSQL 中约束Constraints

在 PostgreSQL 中&#xff0c;约束&#xff08;Constraints&#xff09;是用于限制进入数据库表中数据的规则。它们确保数据的准确性和可靠性&#xff0c;通过定义规则来防止无效数据的插入或更新。PostgreSQL 支持多种类型的约束&#xff0c;每种约束都有特定的用途和语法。以…...

✨系统设计时应时刻考虑设计模式基础原则

目录 &#x1f4ab;单一职责原则 (Single Responsibility Principle, SRP)&#x1f4ab;开放-封闭原则 (Open-Closed Principle, OCP)&#x1f4ab;依赖倒转原则 (Dependency Inversion Principle, DIP)&#x1f4ab;里氏代换原则 (Liskov Substitution Principle, LSP)&#x…...

【Linux】多线程(下)

目录 一、生产者消费者模型 1.1 概念 1.2 基于阻塞队列 1.3 POSIX信号量 初始化信号量 销毁信号量 等待信号量 发布信号量 1.4 基于环形队列和POSIX信号量 二、线程池 2.1 概念 2.2 代码 三、封装Linux线程库 四、单例模式 4.1 概念 4.2 单例模式的实现方式 4…...

Element-Plus如何修改日期选择器输入框el-date-picker的圆角

使用 el-date-picker 的 style 属性 :style"{ --el-border-radius-base: 10px }"<!-- 日期 --> <el-form-item label"日期" prop"establishmentDate"><el-date-picker v-model"form.establishmentDate" type"dat…...

skywalking es查询整理

索引介绍 sw_records-all 这个索引用于存储所有的采样记录&#xff0c;包括但不限于慢SQL查询、Agent分析得到的数据等。这些记录数据包括Traces、Logs、TopN采样语句和告警信息。它们被用于性能分析和故障排查&#xff0c;帮助开发者和运维团队理解服务的行为和性能特点。 …...

故障排除-------K8s挂载集群外NFS异常

故障排除-------K8s挂载集群外NFS异常 1. 故障现象2. 原因梳理2.1 排查思路2.2 确认yaml内容2.3 创建k8s内的nfs测试2.3.1 创建nfs和svc2.3.2 测试创建pvc2.3.3 测试结果 2.4 NFS服务端故障排除2.4.1 网络阻断排除2.4.2 排除服务状态问题2.4.3 排查NFS权限问题 3. 故障排除 1. …...

Easyexcel(6-单元格合并)

相关文章链接 Easyexcel&#xff08;1-注解使用&#xff09;Easyexcel&#xff08;2-文件读取&#xff09;Easyexcel&#xff08;3-文件导出&#xff09;Easyexcel&#xff08;4-模板文件&#xff09;Easyexcel&#xff08;5-自定义列宽&#xff09;Easyexcel&#xff08;6-单…...

解决登录Google账号遇到手机上Google账号无法验证的问题

文章目录 场景小插曲解决方案总结 场景 Google账号在新的设备上登录的时候&#xff0c;会要求在手机的Google上进行确认验证&#xff0c;而如果没有安装Google play就可能出现像我一样没有任何弹框&#xff0c;无法实现验证 小插曲 去年&#xff0c;我在笔记本上登录了Googl…...

【Redis_Day5】String类型

【Redis_Day5】String类型 String操作String的命令set和get&#xff1a;设置、获取键值对mset和mget&#xff1a;批量设置、获取键值对setnx/setex/psetexincr和incrby&#xff1a;对字符串进行加操作decr/decrby&#xff1a;对字符串进行减操作incrbyfloat&#xff1a;浮点数加…...

Python MySQL SQLServer操作

Python MySQL SQLServer操作 Python 可以通过 pymysql 连接 MySQL&#xff0c;通过 pymssql 连接 SQL Server。以下是基础操作和代码实战示例&#xff1a; 一、操作 MySQL&#xff1a;使用 pymysql python 操作数据库流程 1. 安装库 pip install pymysql2. 连接 MySQL 示例 …...

Java技术分享

剖析equals方法 1、对于Object来说&#xff0c;其equals()方法底层实现就是""&#xff0c;都是比较对象的引用是否相等&#xff0c;下为JDK源码。 Object c 1; Object d 1; boolean equals c.equals(d);public boolean equals(Object obj) {return (this obj);…...

CentOS7卸载node

CentOS7卸载node 在 CentOS 7 上卸载 Node.js 可以通过以下步骤进行。具体步骤取决于你是如何安装 Node.js 的。常见的安装方法包括使用包管理器&#xff08;如 yum 或 nvm&#xff09;和手动安装。 方法 1&#xff1a;使用 yum 卸载 Node.js 如果你是通过 yum安装的 Node.j…...

LeetCode 2257. Count Unguarded Cells in the Grid

&#x1f517; https://leetcode.com/problems/count-unguarded-cells-in-the-grid 题目 给出一个 m x n 的二维表格&#xff0c;格子上有士兵 guard&#xff0c;有墙 wall士兵可以盯上他上下左右所有的格子&#xff0c;碰到墙的格子就停止返回没有被士兵盯到的格子的数量 思…...

即时通讯服务器被ddos攻击了怎么办?

攻击即时通讯系统的主要手段 击键记录 目前盗取即时通讯工具帐号信息的最主要方法是通过特洛伊木马等恶意软件&#xff0c;例如QQ木马&#xff0c;这类程序能够盗取QQ密码信息&#xff0c;常见的能够盗取最新版本QQ密码的木马程序有十几种之多。几乎所有主要的QQ木马程序都采…...

【大数据学习 | Spark-Core】Spark中的join原理

join是两个结果集之间的链接&#xff0c;需要进行数据的匹配。 演示一下join是否存在shuffle。 1. 如果两个rdd没有分区器&#xff0c;分区个数一致 &#xff0c;会发生shuffle。但分区数量不变。 scala> val arr Array(("zhangsan",300),("lisi",…...

搞好姓氏源流网站建设/搜索引擎营销的主要方法

1. 在widget类中自动定义了bool event函数&#xff0c;这个函数默认会记录所有的操作类型&#xff0c;并且可以通过event->type进行调用;2. 所有的控件默认都有eventfilter()函数和installEventfilter()函数&#xff0c;控件可以直接调用&#xff0c;如果需要对eventfilter函…...

上海市建设安全协会网站/湖南 seo

错误多为找不到“.exe文件&#xff0c;或者QT相关的代码下有未包含对应库的波浪线” 试过网上很多方法&#xff0c;补充一点。。。。 右击项目&#xff0d;&#xff1e;Qt Project Settings&#xff0d;&#xff1e;Properties:Version选择对应的版本 右击项目&#xff0d;&…...

租车网站 模板/软文媒体

1.主要的子类&#xff1a; 1&#xff09; FileInputStream把一个文件作为InputStream&#xff0c;实现对文件的读取操作    2&#xff09; ByteArrayInputStream&#xff1a;把内存中的一个缓冲区作为InputStream使用    3&#xff09; StringBufferInputStream&…...

king wordpress theme/外链网站是什么

“近日&#xff0c;水韵城商业管理有限公司与竞优软件达成战略合作协议&#xff0c;在水韵城天虹商业地产管理信息化方面开展合作关系&#xff0c;深化合作内容。水韵城天虹将使用竞优的商业运营管理系统&#xff0c;搭建一体化管控和运营信息化平台&#xff0c;实现从传统管理…...

wordpress多媒体不显示/网络营销渠道的功能

Redis1、前言2、HyperLogLog 介绍3、基础使用4、布隆过滤器5、编译方式5.1、下载并安装布隆过滤器6、启动验证上一篇文章&#xff08; 地址&#xff09;1、前言 在我们实际开发的过程中&#xff0c;可能会遇到这样一个问题&#xff0c;当我们需要统计一个大型网站的独立访问次…...

wordpress 主题生成/营销型网站建设ppt

1 UI界面代码; 看着多。实际上真正布局用到的地方,也是非常有限的。 <Page x:Class="Wpf.Jie.Views.Jie1_Page1"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml&qu…...