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):组织有两种:个人组织和团队组织,多个个人可以组合成一个团队,不同的个人与团队可以组合成一个更大的团队。 使用控制台或者JavaFx界面…...
Amazon商品详情API接口:电商创新与用户体验的驱动力
在电子商务蓬勃发展的今天,作为全球最大的电商平台之一,亚马逊(Amazon)凭借其强大的技术实力和丰富的商品资源,为全球用户提供了优质的购物体验。其中,Amazon商品详情API接口在电商创新与用户体验提升方面扮…...
手机无法连接服务器1302什么意思?
你有没有遇到过手机无法连接服务器,屏幕上显示“1302”这样的错误代码?尤其是在急需使用手机进行工作或联系朋友时,突然出现的连接问题无疑会带来不少麻烦。那么,什么是1302错误,它又意味着什么呢? 1302错…...
Android adb shell dumpsys audio 信息查看分析详解
Android adb shell dumpsys audio 信息查看分析详解 一、前言 Android 如果要分析当前设备的声音通道相关日志, 仅仅看AudioService的日志是看不到啥日志的,但是看整个audio关键字的日志又太多太乱了, 所以可以看一下系统提供的一个调试指令…...
Python 网络爬虫操作指南
网络爬虫是自动化获取互联网上信息的一种工具。它广泛应用于数据采集、分析以及实现信息聚合等众多领域。本文将为你提供一个完整的Python网络爬虫操作指南,帮助你从零开始学习并实现简单的网络爬虫。我们将涵盖基本的爬虫概念、Python环境配置、常用库介绍。 上传…...
基于FPGA的2FSK调制-串口收发-带tb仿真文件-实际上板验证成功
基于FPGA的2FSK调制 前言一、2FSK储备知识二、代码分析1.模块分析2.波形分析 总结 前言 设计实现连续相位 2FSK 调制器,2FSK 的两个频率为:fI15KHz,f23KHz,波特率为 1500 bps,比特0映射为f 载波,比特1映射为 载波。 1)…...
JavaScript的基础数据类型
一、JavaScript中的数组 定义 数组是一种特殊的对象,用于存储多个值。在JavaScript中,数组可以包含不同的数据类型,如数字、字符串、对象、甚至其他数组。数组的创建有两种常见方式: 字面量表示法:let fruits [apple…...
第三讲 架构详解:“隐语”可信隐私计算开源框架
目录 隐语架构 隐语架构拆解 产品层 算法层 计算层 资源层 互联互通 跨域管控 本文主要是记录参加隐语开源社区推出的第四期隐私计算实训营学习到的相关内容。 隐语架构 隐语架构拆解 产品层 产品定位: 通过可视化产品,降低终端用户的体验和演…...
JDBC编程---Java
目录 一、数据库编程的前置 二、Java的数据库编程----JDBC 1.概念 2.JDBC编程的优点 三.导入MySQL驱动包 四、JDBC编程的实战 1.创造数据源,并设置数据库所在的位置,三条固定写法 2.建立和数据库服务器之间的连接,连接好了后ÿ…...
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当前最新的版本,与历史版本对比,Spring 5对Spring核心框架进行了修订和更新,增加了很多新特性,如支持响应式编程等。 更新JDK基线 因为Spring 5代码库运行于JDK 8之上,所以Spri…...
Linux关于vim的笔记
Linux关于vim的笔记:(vimtutor打开vim 教程) --------------------------------------------------------------------------------------------------------------------------------- 1. 光标在屏幕文本中的移动既可以用箭头键,也可以使用 hjkl 字母键…...
linux mount nfs开机自动挂载远程目录
要在Linux系统中实现开机自动挂载NFS共享目录,你需要编辑/etc/fstab文件。以下是具体步骤和示例: 确保你的系统已经安装了NFS客户端。如果没有安装,可以使用以下命令安装: 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编码
在无线通信和数据存储领域,LDPC(低密度奇偶校验码)编码是一种高效、纠错能力强大的错误校正技术。本MATLAB仿真程序全面地展示了如何在AWGN(加性高斯白噪声)信道下应用LDPC编码与BPSK(二进制相移键控&#…...
PostgreSQL 中约束Constraints
在 PostgreSQL 中,约束(Constraints)是用于限制进入数据库表中数据的规则。它们确保数据的准确性和可靠性,通过定义规则来防止无效数据的插入或更新。PostgreSQL 支持多种类型的约束,每种约束都有特定的用途和语法。以…...
✨系统设计时应时刻考虑设计模式基础原则
目录 💫单一职责原则 (Single Responsibility Principle, SRP)💫开放-封闭原则 (Open-Closed Principle, OCP)💫依赖倒转原则 (Dependency Inversion Principle, DIP)💫里氏代换原则 (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 这个索引用于存储所有的采样记录,包括但不限于慢SQL查询、Agent分析得到的数据等。这些记录数据包括Traces、Logs、TopN采样语句和告警信息。它们被用于性能分析和故障排查,帮助开发者和运维团队理解服务的行为和性能特点。 …...
从Excel到BI Launchpad:SAP BW/4HANA数据分析实战,手把手教你用BO做报表
从Excel到BI Launchpad:SAP BW/4HANA数据分析实战指南 1. 企业级数据分析的进化之路 在当今数据驱动的商业环境中,企业数据分析正经历着从静态报表到动态洞察的革命性转变。传统Excel虽然灵活易用,但在处理海量数据、实现实时协作和构建企业级…...
如何快速掌握雀魂Mod Plus:解锁全角色皮肤的新手完全指南
如何快速掌握雀魂Mod Plus:解锁全角色皮肤的新手完全指南 【免费下载链接】majsoul_mod_plus 雀魂解锁全角色、皮肤、装扮等,支持全部服务器。 项目地址: https://gitcode.com/gh_mirrors/ma/majsoul_mod_plus 还在为无法获得心仪角色和皮肤而烦恼…...
SubLens:AI订阅管理浏览器插件,一站式聚合账单与扣款提醒
1. 项目概述:一个帮你管好AI订阅账单的浏览器插件 如果你和我一样,订阅了不止一个AI服务——比如ChatGPT Plus用来日常对话和写作,Claude Pro用来处理长文档,GitHub Copilot写代码,Cursor辅助开发,再加上G…...
ARM Firmware Suite与Integrator开发板嵌入式开发指南
1. ARM Firmware Suite与Integrator开发板概述ARM Firmware Suite(AFS)是ARM架构下专为嵌入式系统开发设计的固件套件,在Integrator系列开发板上发挥着核心作用。这套工具链最初由ARM Limited在1999-2002年间开发,至今仍在许多传统…...
从怀疑到真香!2026年我亲测十多款语音识别转文字app只留这一个
开完2小时讨论会,你要花3小时逐句整理纪要?采访了3个受访者,你戴耳机听一天录音,还漏了一半核心观点?做方言访谈,转出来的文字驴唇不对马嘴,你还要返工重听? 这些磨人的痛点…...
Midjourney水彩风提示词已进入“语义过载”危机?2024Q2最新精简指令集发布(仅保留11个高响应关键词,准确率提升63.8%)
更多请点击: https://intelliparadigm.com 第一章:Midjourney水彩风提示词的语义过载现象本质解析 水彩风格生成中,“watercolor”、“gouache”、“loose brushstrokes”、“wet-on-wet”等提示词常被叠加使用,表面增强风格表征…...
告别内存焦虑:用STM32+外部SRAM(IS62WV51216)实现大数组和GUI缓存
STM32外部SRAM实战:突破内存限制的工程化解决方案 当你在STM32上开发图形界面或处理音频流时,是否遇到过程序突然崩溃的窘境?那些隐藏在编译通过背后的内存溢出问题,往往在项目后期才暴露出来。最近接手的一个智能家居控制面板项目…...
坐北朝南教育集团
在教育行业不断发展的当下,家长和学生在选择教育机构时常常面临诸多困扰,寻找一家口碑好、教学质量高的教育集团成为了关键。坐北朝南教育集团作为辽沈地区知名的综合教育航母,在解决教育领域痛点方面表现出色,成为众多家长和学生…...
LeagueAkari英雄联盟自动化工具终极使用指南:本地化智能助手全面解析
LeagueAkari英雄联盟自动化工具终极使用指南:本地化智能助手全面解析 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 你是否曾为英…...
英雄联盟LCU工具:如何用LeagueAkari提升你的游戏效率
英雄联盟LCU工具:如何用LeagueAkari提升你的游戏效率 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit LeagueAkari是一款基于英雄联…...
