实验七 组合器模式的应用

news2024/11/24 1:57:46

实验目的
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 airplanes
     for(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 units
	  for(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 not
     for(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 units
	 else 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 units
           else 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 Actions
         if(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,我们只需要使用这些方法就可以操作它了。

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

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

相关文章

【聚沙成塔系列】通信笔记知识汇总一

什么是NCO 载波NCO通过控制频率w控制。每次要累加的数字M就是频率控制字。调节M进而控制载波频率。 什么是带宽 3db带宽 常说的3dB带宽&#xff0c;是指在信号功率谱对称的情况下&#xff0c;功率谱密度比信号频谱中心处的峰值下降3dB的两个频率之间的频率范围 工作带宽 工作…

十年老程序员分享13个最常用的Python深度学习库和介绍,赶紧收藏码住!

文章目录 前言CaffeTheanoTensorFlowLasagneKerasmxnetsklearn-theanonolearnDIGITSBlocksdeepypylearn2Deeplearning4j关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案…

什么是本地存储的有效期?

前言 本地存储是一种在Web开发中常用的客户端存储数据的方式&#xff0c;它可以让网页应用程序在用户的浏览器中存储和检索数据&#xff0c;而无需依赖服务器来保存信息。本地存储的有效期是指数据存储在用户的设备上可以被访问和保留的时间段。在本地存储中&#xff0c;有两种…

7 mysql索引

1、索引的本质 索引&#xff08;Index&#xff09;是帮助MySQL高效获取数据的数据结构。 2、InnoDB支持常见的索引 B树索引、 全文索引、 哈希索引&#xff0c; 其中比较关键的是B树索引 3、HashMap不适合做数据库索引&#xff1f; 1.hash表只能匹配是否相等&#xff0c;不…

高数笔记06:无穷级数

图源&#xff1a;文心一言 时间比较紧张&#xff0c;仅导图~~&#x1f95d;&#x1f95d; 第1版&#xff1a;查资料、画导图~&#x1f9e9;&#x1f9e9; 参考资料&#xff1a;《高等数学 基础篇》武忠祥 &#x1f433;目录 &#x1f433;常数项级数 &#x1f40b;概要 &…

ABAP Json和对象的转换

se24新建类ZCL_JSON保存 点击修改&#xff0c;进入下图界面&#xff0c;点击红框。 复制粘贴下面代码 CLASS zcl_json DEFINITIONPUBLICCREATE PUBLIC .PUBLIC SECTION. *"* public components of class ZCL_JSON *"* do not include other source files here!!!TYP…

效率至少提高2倍!最实用的Linux命令合集

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

上门预约按摩家政小程序开发;

上门预约按摩家政小程序开发&#xff0c;都可以做 上门按摩&#xff0c;服务预约小程序开发 服务预约类小程序开发。 小程序开放订单预约、即时服务、在线评价用户管理、会员充值、平优惠券、、平台自营、抢单、事个人入驻、分销邀请、商户入驻 等等 按摩上门预约、回收上门预约…

CSS默认宽度

所谓的默认宽度&#xff0c;就是不设置width属性时&#xff0c;元素所呈现出来的宽度 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title></title><style>* {margin: 0;padding: 0;}.box {/…

【数据结构】——顺序表(增删查改)

目录 前言&#xff1a; 顺序表&#xff1a; 1、概念及分类 1.1顺序表分类 静态顺序表 动态顺序表 2、接口实现 2.1功能要求 2.2功能实现 &#x1f4a1;初始化顺序表 &#x1f4a1;销毁顺序表 &#x1f4a1;顺序表尾插入 &#x1f4a1;检查是否扩容 &#x1f4a1;…

科技创意赋能乡村文旅振兴

近日&#xff0c;由北京大学创意产业研究中心联合中国国际科技促进会新基建专委会共同主办的“科技创意赋能乡村振兴研讨会”在京举行&#xff0c;与会专家学者围绕“和美乡村共同富裕智慧文旅”主题进行深入探讨。北京大学创意产业研究中心副主任吕艺、国家文化和旅游公共服务…

Python点云处理(十九)点云地面点提取——CSF布料模拟算法

目录 0 简述1 算法原理2 具体步骤3 实现0 简述 对于点云地面点滤波,众多传统算法滤波效果容易受到地形特征的影响(通常在复杂场景及陡峭地形区域滤波效果较差)且常常需要用户对数据有较为丰富的先验知识来进行设置滤波器中的各种参数。为了解决这些问题,张吴明教授等人提出…

Allegro如何快速将目标旋转90度操作指导

Allegro如何快速将目标旋转90度操作指导 在用Allegro进行PCB设计的时候,时常需要目标旋转90度,我们常用的命令是Spin,如下图以旋转电阻为例 点击Edit点击SpinOp

数据结构初阶---复杂度的OJ例题

复杂度的OJ例题 一、消失的数字1.思路一2.思路二3.思路三 二、旋转数组1.思路一2.思路二3.思路三 一、消失的数字 数组nums包含从0到n的所有整数&#xff0c;但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(N)时间内完成吗&#xff1f; 链接&#xff1a;力扣&…

用「埋点」记录自己,不妄过一生

最近有朋友问我「埋点怎么做」&#xff0c;给朋友讲了一些互联网广告的案例&#xff0c;从源头的数据采集讲到末尾的应用分析和流量分配等&#xff08;此处省略N多字&#xff09; 解释完以后&#xff0c;我想到一个问题&#xff1a;有了埋点可以做分析&#xff0c;那我们对自己…

尚硅谷大数据项目《在线教育之实时数仓》笔记006

视频地址&#xff1a;尚硅谷大数据项目《在线教育之实时数仓》_哔哩哔哩_bilibili 目录 第9章 数仓开发之DWD层 P041 P042 P043 P044 P045 P046 P047 P048 P049 P050 P051 P052 第9章 数仓开发之DWD层 P041 9.3 流量域用户跳出事务事实表 P042 DwdTrafficUserJum…

Android岗位居然要求有鸿蒙开发的需求了?HarmonyOS它来了

鸿蒙才开发几年,就已经让对手们脊背发凉了&#xff0c;要知道主流操作系统都是积累几十年的产物。 以苹果MacOS为例,其前身NextStep是85年开干的。另一家微软公司,Win95爆卖的时候,中国还没加入WTO。 大家使用过鸿蒙系统产品的,应该能直观感觉到它的流畅性,易用性,如果你有个…

leetcode刷题日记:70.Climbing Stairs(爬楼梯)

给了我们n阶楼梯让我们去爬&#xff0c;每次只能爬1阶或2阶&#xff0c;这个我们可以使用递归的方法进行解决&#xff0c;向上爬的过程与向下降的过程是一样的&#xff0c;所以我们就可以这样考虑&#xff0c;现在就是n阶楼梯每一次下降1阶或2阶有多少种方法刚好下降到0阶。 i…

IDEA取消git对项目的版本控制

前言 前几天新建项目的时候不小心选了个git仓库&#xff0c;导致这个测试项目一直被git管理着。 解决办法 1 右键项目 选择打开资源目录 2 删除.git文件 把目录下的.git文件删掉 3 删除idea中的git管理 删除完.git文件后&#xff0c;进入idea&#xff0c;右下角会有这样的提…

ElementUI-tree拖拽功能与节点自定义

前言 在管理端会遇到多分类时&#xff0c;要求有层次展示出来&#xff0c;并且每个分类有额外的操作。例如&#xff1a;添加分类、编辑分类、删除、拖到分类等。 下面将会记录这样的一个需求实习过程。 了解需求 分类展示按层级展示分类根据特定的参数展示可以操作的按钮&a…