实验七 组合器模式的应用
实验目的
1)掌握组合器模式(composite)的特点
2 分析具体问题,使用组合器模式进行设计。
实验内容和要求
在例3.3的设计中,添加一个空军大队( Wing)类,该类与Squadron、Group类是平行的,因此应该继承了AirUnit类。该类的写法与Squadron或者Group类是类似的,所不同的是一个Wing有216中类型的飞机。
【模式代码(JAVA语言实现)】
1、添加Wing 类:红色部分是添加进去的
package ddd;/*=======================*/
/* Represents an air Wing */
/*=======================*/public class Wing extends AirUnit{public static final String FEATURES = "A Wing with 216 aircrafts";Airforce[] fighters = new Airforce[162];Airforce[] bombers = new Airforce[18];Airforce[] transporters= new Airforce[18];Airforce[] eAircrafts = new Airforce[18];public Wing(){for(int k=0;k<162;k++){fighters[k] = new F22();super.attach(fighters[k]);// need 162 fighters}for(int k=0;k<18;k++){bombers[k] = new B52();super.attach(bombers[k] );// need 18 bombers}for(int k=0;k<18;k++){transporters[k] = new C130J();super.attach(transporters[k]);// need 18 transporters}for(int k=0;k<18;k++){eAircrafts[k] = new E9A();super.attach(eAircrafts[k]);// need 18 eAirplanes}}public String getDescription(){return FEATURES;}public String fight(){return super.fight();}
}
2、添加GUI:红色部分是添加进去的
package ddd;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.Iterator;/*===================================================================*/
/* User interface for Testing the Composite design pattern program */
/*===================================================================*/
public class AirforceGUI extends JFrame implements ItemListener{private JScrollPane checkBoxPane, textPane;private JSplitPane splitPane;private JTextArea txtAirMission;private JButton submitBtn, exitBtn;private JPanel checkBoxPanel, btnPanel, choicePanel;private JCheckBox[] airCheckBox;private JCheckBox[] airUnitCheckBox;private String[] airPlaneName ={"F-15E-Strike-Eagle","F-16C/D-Fighting-Falcon","F22A-Rapter","B-1B-Lancer","B-2A-Spirit","B-52H-Stratofortress","C-130E/H-Hercules","C-130J-Super-Hercules","CV-22B-Osprey","E-9A", "EC-130H/J-Compass", "AirForce","Fighters","Bombers", "Transporters", "E-Planes"};private String[] AirForceUnit = {"SQUADRON", "GROUP", "WING"};public final int SELECTED = ItemEvent.SELECTED;public final int DESELECTED = ItemEvent.DESELECTED;private static final String[] OPTION = {"Solo", "Group"};private JComboBox[] optComoBox=new JComboBox[11];private int[] ckBoxStates;private GridBagLayout gridbag = new GridBagLayout();private GridBagConstraints gbc = new GridBagConstraints();public AirforceGUI(){super("Composite Pattern - Airforce");ckBoxStates = new int[50];setUpChoicePanel();setUpScrollPanes();}private void setUpChoicePanel(){submitBtn = new JButton("Submit");exitBtn = new JButton("Exit");submitBtn.addActionListener( new ButtonActionListener());exitBtn.addActionListener( new ButtonActionListener());JPanel btnPanel =new JPanel();btnPanel.add(submitBtn);btnPanel.add(exitBtn);int numCheckBox = airPlaneName.length;airCheckBox = new JCheckBox[numCheckBox];airUnitCheckBox = new JCheckBox[3];//Check boxes for selection of the airplanesfor(int m=0; m<numCheckBox; m++){airCheckBox[m]= new JCheckBox(airPlaneName[m]);airCheckBox[m].setMnemonic(KeyEvent.VK_C);airCheckBox[m].addItemListener(this);}//Check boxes for selection of air unitsfor(int m=0; m<3; m++){airUnitCheckBox[m]= new JCheckBox(AirForceUnit[m]);airUnitCheckBox[m].setMnemonic(KeyEvent.VK_C);airUnitCheckBox[m].addItemListener(this);}//Combobox for deciding on solo flight or notfor(int i=0;i<11;i++){optComoBox[i]= new JComboBox(OPTION);optComoBox[i].addItemListener(this);}checkBoxPanel = new JPanel();checkBoxPanel.setLayout(gridbag);for(int m=0; m<numCheckBox; m++)checkBoxPanel.add(airCheckBox[m]);for(int m=0; m<3; m++)checkBoxPanel.add(airUnitCheckBox[m]);for(int i=0;i<11;i++)checkBoxPanel.add(optComoBox[i]);gbc.insets.top = 0;gbc.insets.bottom = 0;gbc.insets.left = 0;gbc.insets.right = 0;gbc.anchor = GridBagConstraints.WEST;add(0, 0, airCheckBox[11]);add(1, 1, airCheckBox[12]);add(2, 3, airCheckBox[0]);add(2, 4, airCheckBox[1]);add(2, 5, airCheckBox[2]);add(1, 6, airCheckBox[13]);add(2, 7, airCheckBox[3]);add(2, 8, airCheckBox[4]);add(2, 9, airCheckBox[5]);add(1, 10, airCheckBox[14]);add(2, 11, airCheckBox[6]);add(2, 12, airCheckBox[7]);add(2, 13, airCheckBox[8]);add(1, 14, airCheckBox[15]);add(2, 15, airCheckBox[9]);add(2, 16, airCheckBox[10]);add(3, 3, optComoBox[0]);add(3, 4, optComoBox[1]);add(3, 5, optComoBox[2]);add(3, 7, optComoBox[3]);add(3, 8, optComoBox[4]);add(3, 9, optComoBox[5]);add(3, 11, optComoBox[6]);add(3, 12, optComoBox[7]);add(3, 13, optComoBox[8]);add(3, 15, optComoBox[9]);add(3, 16, optComoBox[10]);add(0, 17, airUnitCheckBox[0]);add(0, 18, airUnitCheckBox[1]);add(0, 19, airUnitCheckBox[2]);choicePanel = new JPanel();choicePanel.setMinimumSize(new Dimension(500, 300));choicePanel.setLayout(new BorderLayout());choicePanel.add(checkBoxPanel, "Center");choicePanel.add(btnPanel, "South");}private void add(int m, int n, JComponent com ){gbc.gridx = m;gbc.gridy = n;gridbag.setConstraints(com, gbc);}private void setUpScrollPanes(){txtAirMission = new JTextArea(3,10);txtAirMission.setBackground(Color.cyan);txtAirMission.setText("选择军事单位:空军中队(SQUADRON),空军团(GROUP)或者空军大队(WING)"+ "\n组成固定单位的战斗力量。你也可以直接选择各种机型形成临时的编队"+"\n飞行(在组合框中选Group)或者单飞(在组合框中选Solo)。");checkBoxPane = new JScrollPane(choicePanel);textPane = new JScrollPane(txtAirMission);textPane.setMinimumSize(new Dimension(500, 100));splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, checkBoxPane, textPane);splitPane.setDividerLocation(470);getContentPane().add(splitPane);setSize(new Dimension(500, 500));setVisible(true);}//========================================// 新增加功能,需要理解本监听器所涉及的方法。//========================================class ButtonActionListener implements ActionListener{public void actionPerformed(ActionEvent e) {txtAirMission.setText("\n===Airforce New Mission===\n");createAirGroup(e);}}public void itemStateChanged(ItemEvent e){Object source = e.getItemSelectable();int state = e.getStateChange();if (source == airCheckBox[11]) {if(state == SELECTED){for(int m=12; m<16; m++)airCheckBox[m].setSelected(true);}else if (state == DESELECTED){for(int m=12; m<16; m++)airCheckBox[m].setSelected(false);}}else if (source == airCheckBox[12]) {if(state == SELECTED){for(int m=0; m<3; m++)airCheckBox[m].setSelected(true);}else if (state == DESELECTED){for(int m=0; m<3; m++)airCheckBox[m].setSelected(false);}}else if (source == airCheckBox[0])ckBoxStates[0]=state;else if (source == airCheckBox[1])ckBoxStates[1]=state;else if (source == airCheckBox[2])ckBoxStates[2]=state;else if (source == airCheckBox[13]){if(state == SELECTED){for(int m=3; m<6; m++)airCheckBox[m].setSelected(true);}else if (state == DESELECTED){for(int m=3; m<6; m++)airCheckBox[m].setSelected(false);}}else if (source == airCheckBox[3])ckBoxStates[3]=state;else if (source == airCheckBox[4])ckBoxStates[4]=state;else if (source == airCheckBox[5])ckBoxStates[5]=state;else if (source == airCheckBox[14]){if(state == SELECTED){for(int m=6; m<9; m++)airCheckBox[m].setSelected(true);}else if (state == DESELECTED){for(int m=6; m<9; m++)airCheckBox[m].setSelected(false);}}else if (source == airCheckBox[6])ckBoxStates[6]=state;else if (source == airCheckBox[7])ckBoxStates[7] = state;else if (source == airCheckBox[8])ckBoxStates[8]=state;else if (source == airCheckBox[15]){if(state == SELECTED){airCheckBox[9].setSelected(true);airCheckBox[10].setSelected(true);}else if (state == DESELECTED){airCheckBox[9].setSelected(false);airCheckBox[10].setSelected(false);}}else if (source == airCheckBox[9])ckBoxStates[9]=state;else if (source == airCheckBox[10])ckBoxStates[10]=state;//== for air unitselse if (source == airUnitCheckBox[0])ckBoxStates[11]=state;else if (source == airUnitCheckBox[1])ckBoxStates[12]=state;else if (source == airUnitCheckBox[2])ckBoxStates[13]=state;}private void createAirGroup(ActionEvent e){Airforce airCraft = null;Airforce unit = null;AirUnit airGroup = new AirUnit();AirUnit airUnits = new AirUnit();boolean isSolo = false;int len = ckBoxStates.length;String unitInfo = null;if (e.getActionCommand().equals("Submit")) {for(int m = 0; m < len; m++ ){if ((m==0) && (ckBoxStates[0] == SELECTED)) {airCraft = new F15();if(optComoBox[0].getSelectedItem().equals("Solo"))isSolo = true;}else if ((m==1) && (ckBoxStates[1] == SELECTED)){airCraft = new F16();if(optComoBox[1].getSelectedItem().equals("Solo"))isSolo = true;}else if ((m==2) && (ckBoxStates[2] == SELECTED)){airCraft = new F22();if(optComoBox[2].getSelectedItem().equals("Solo"))isSolo = true;}else if ((m==3) && (ckBoxStates[3] == SELECTED)){airCraft = new B1B();if(optComoBox[3].getSelectedItem().equals("Solo"))isSolo = true;}else if ((m==4) && (ckBoxStates[4] == SELECTED)) {airCraft = new B2A();if(optComoBox[4].getSelectedItem().equals("Solo"))isSolo = true;}else if ((m==5) && (ckBoxStates[5] == SELECTED)){airCraft = new B52();if(optComoBox[5].getSelectedItem().equals("Solo"))isSolo = true;}else if ((m==6) && (ckBoxStates[6] == SELECTED)) {airCraft = new C130E();if(optComoBox[6].getSelectedItem().equals("Solo"))isSolo = true;}else if ((m==7) && (ckBoxStates[7] == SELECTED)) {airCraft = new C130J();if(optComoBox[7].getSelectedItem().equals("Solo"))isSolo = true;}else if ((m==8) && (ckBoxStates[8] == SELECTED)) {airCraft = new CV22();if(optComoBox[8].getSelectedItem().equals("Solo"))isSolo = true;}else if ((m==9) && (ckBoxStates[9] == SELECTED)) {airCraft = new E9A();if(optComoBox[9].getSelectedItem().equals("Solo"))isSolo = true;}else if ((m==10) && (ckBoxStates[10] == SELECTED)) {airCraft = new EC130();if(optComoBox[10].getSelectedItem().equals("Solo"))isSolo = true;}//== for air unitselse if ((m==11) && (ckBoxStates[11] == SELECTED)){unit = new Squadron();airUnits.attach(unit);unitInfo = unit.getDescription();}else if ((m==12) && (ckBoxStates[12] == SELECTED)){unit = new Group();airUnits.attach(unit);unitInfo = unit.getDescription();}else if ((m==13) && (ckBoxStates[13] == SELECTED)){unit = new Wing();airUnits.attach(unit);unitInfo = unit.getDescription();}if( airCraft != null){if(isSolo == false)airGroup.attach(airCraft);else{String f = airCraft.fight();txtAirMission.append("Solo Flight Mission: \n" + f + "\n");}airCraft = null;isSolo = false;}} //end for loop//Display Air Group Actionsif(airGroup.getSize() > 0){String str = airGroup.fight();txtAirMission.append("Mission with newly-formed unit: \n" + str + "\n");}if(airUnits.getSize() > 0){String str = airUnits.fight();txtAirMission.append("Mission with fixed unit: \n" + unitInfo + " \n");txtAirMission.append("Aircrafts in this mission: \n" + str + "\n");}}else if (e.getActionCommand().equals("Exit")) {System.exit(1);}}public static void main(String args[]){try {JFrame.setDefaultLookAndFeelDecorated(true);//UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");}catch (Exception evt) {}AirforceGUI frame = new AirforceGUI();frame.addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent e){System.exit(0);}});frame.setSize(500, 600);frame.setVisible(true);}
}
【运行截图】


【实验小结】
通过本次实验,学会了使用组合器方法模式。组合器方法模式的适用性如下:
我们这样来简单的理解组合模式,组合模式就是把一些现有的对象或者元素,经过组合后组成新的对象,新的对象提供内部方法,可以让我们很方便的完成这些元素或者内部对象的访问和操作。我们也可以把组合对象理解成一个容器,容器提供各种访问其内部对象或者元素的API,我们只需要使用这些方法就可以操作它了。
相关文章:
实验七 组合器模式的应用
实验目的 1)掌握组合器模式(composite)的特点 2 分析具体问题,使用组合器模式进行设计。 实验内容和要求 在例3.3的设计中,添加一个空军大队( Wing)类,该类与Squadron、Group类是平行的,因此应该继承了AirU…...
Springboot实现人脸识别与WebSocket长连接的实现
0.什么是WebSocket,由于普通的请求是间断式发送的,如果要同一时间发生大量的请求,必然导致响应速度慢(因为根据tcp协议要经过三层握手,如果不持续发送,就会导致n多次握手,关闭连接,打开连接) 1.业务需求: 由于我需要使用java来处理视频的问题,视频其实就是图片,相当于每张图片…...
智能安全帽功能-EIS智能防抖摄像头4G定位视频语音气体检测
智能安全帽是一种集成多种智能功能的产品,例如实时定位、语音对讲、健康监测和AI智能预警等。这些丰富的功能能够更好地帮助工人开展工作,并提升安全保障水平。智能安全帽在各个行业中的应用越来越广泛。尤其在工程建设领域,项目管理和工作安…...
TEMU跨境平台珠宝首饰RSL报告如何办理?
首饰或者产品TEMU拼多多跨境平台要求的RSL报告如何办理? 珠宝首饰上架前必须进行RSL Report(欧盟禁限用化学物质检测报告) 随着人们对珠宝首饰的要求越来越高,为了确保珠宝首饰的安全性,欧盟REACH法规规定,…...
51单片机的篮球计分器液晶LCD1602显示( proteus仿真+程序+原理图+PCB+设计报告+讲解视频)
51单片机的篮球计分器液晶LCD1602显示 📑1.主要功能:📑讲解视频:📑2.仿真📑3. 程序代码📑4. 原理图📑5. PCB图📑6. 设计报告📑7. 设计资料内容清单&&…...
【NI-DAQmx入门】NI-DAQmx之Python
NI-DAQmx Python GitHub资源: NI-DAQmx Python 文档说明:NI-DAQmx Python Documentation — NI-DAQmx Python API 0.9 documentation nidaqmx支持 CPython 3.7和 PyPy3,需要注意的是多支持USB DAQ和PCI DAQ,cDAQ需要指定…...
YoloV8目标检测与实例分割——目标检测onnx模型推理
一、模型转换 1.onnxruntime ONNX Runtime(ONNX Runtime或ORT)是一个开源的高性能推理引擎,用于部署和运行机器学习模型。它的设计目标是优化执行使用Open Neural Network Exchange(ONNX)格式定义的模型,…...
pcigo图床插件的简单开发
1.前言: 如果想写一个图床并且投入使用,那么,接入picgo一定是一个不错的选择。picgo有着windows,mac,linux等多个客户端版本。实用且方便。 2. 开发的准备: 2.0. 需要安装一个node node这里我就不详细说…...
Find My手机保护壳|苹果Find My与手机保护壳结合,智能防丢,全球定位
随着科技水平的快速发展,科技美容这一行业做为新型产业新生而出。时尚IT品牌随着市场的多元化发展。针对手机品牌和功能的增加而呈多样化,将手机保护壳按质地分有PC壳,皮革 ,硅胶,布料,硬塑,皮套…...
encode和decode的区别
字节序列和字符串是Python中两种不同的数据类型,它们的主要区别在于表示和处理方式! 字节序列(Bytes): 字节序列是一种二进制数据类型,它由一系列字节组成。字节是计算机存储信息的基本单位,每…...
建设项目管理中的 5 大预算挑战
为建设项目管理制定可靠、准确的预算是一项艰巨的任务,对于中小型建筑企业来说尤其如此。预算必须精确,同时还要考虑到每项工作的独特性和复杂性。 一项建筑行业相关调查统计了参与施工预算流程的人员所面临的最大挑战,分别是时间、预算、不…...
vue2 集成 - 超图-SuperMap iClient3D for WebGL
1:下载SuperMap iClient3D for WebGL SuperMap iClient3D for WebGL产品包 打开资源目录如下 2:格式化项目中所用的依赖包 开发指南 从超图官网下载SuperMap iClient3D 11i (2023) SP1 for WebGL_CN.zip解压后,将Build目录下的SuperMap3D复制到项目中 \public\static…...
FPGA设计过程中有关数据之间的并串转化
1.原理 并串转化是指的是完成串行传输和并行传输两种传输方式之间的转换的技术,通过移位寄存器可以实现串并转换。 串转并,将数据移位保存在寄存器中,再将寄存器的数值同时输出; 并转串,将数据先进行移位࿰…...
hologres基础知识一文全
1 功能特性 1.1多场景查询分析 Hologres支持行存、列存、行列共存等多种存储模式和索引类型,同时满足简单查询、复杂查询、即席查询等多样化的分析查询需求。Hologres使用大规模并行处理架构,分布式处理SQL,提高资源利用率,实现海量数据极速分析。 亚秒级交互式分析 Holo…...
阿里云oss迁移到AWS S3
这里写自定义目录标题 0.项目背景1.rclone 方式2.rsync方式3.注意 0.项目背景 公司迁移要求:从阿里云oss到亚马逊s3,数据量大概500G-2T左右。 开启阿里云oss 加速模式,这样能够跨机房和区域加速。 主要采用以下两种方式同步数据,…...
RabbitMQ(高级特性):限流
消费端限流 在rabbitmq中,使用消费端限流必须开启手动签收信息 过MQ可以对请求进行“削峰填谷”,即通过消费端限流的方式限制消息的拉取速度,达到保护消费端的目的。 生产者批量发送消息: Test public void testSendBatch() {…...
LeetCode--570. 至少有5名直接下属的经理
文章目录 1 题目描述2 测试用例3 解题思路3.1 解法 1 1 题目描述 表: Employee ---------------------- | Column Name | Type | ---------------------- | id | int | | name | varchar | | department | varchar | | managerId | in…...
Ubuntu20.04下安装Redis环境
apt安装Redis环境 更新apt-get安装镜像源 安装Redis sudo apt-get install -y redis-server设置密码 # 编辑Redis的配置文件redis.conf,如果不知道配置文件的位置可以执行whereis redis.conf查看 sudo vim /etc/redis/redis.conf取消文件中的requirepass注释&am…...
什么是用户体验测试? 为什么很重要?
在当今数字化时代,用户体验(User Experience,简称UX)已经成为产品成功的关键因素之一。无论是应用程序、网站、硬件设备还是软件,提供出色的用户体验不仅能够吸引更多用户,还能够增加用户满意度,提高品牌忠诚度&#x…...
Android 图片翻面动画
一、需求描述 项目需要实现塔罗牌的翻面效果,需要点击图片后,图片实现翻面,并且翻面过程中,替换成图片资源,类似于扑克牌翻面。 二、实现思路 图片实现翻面效果,并且在动画执行到一半(刚好到图…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
