Patrones de diseño de software y experimentos de arquitectura——3.1-1 Aplicación de patrones combinados

Vínculo: Patrón de diseño de software y experimento de arquitectura——2.1-1 (2) (Resumen) Aplicación del patrón de fábrica
Vínculo: Patrón de diseño de software y experimento de arquitectura——2.2-1 Aplicación del patrón de construcción Vínculo
: Patrón de diseño de software y experimento estructural del sistema— —2.3-1 Aplicación del modo de columna única

1. Propósito experimental

  1. Domina las características del modo combinado
  2. Analizar problemas específicos y usar patrones para el diseño.

2. Contenido experimental

[Tarea 3.1-1] En el diseño del Ejemplo 3.3, agregue una clase Wing, que es paralela a las clases Squadron y Group, por lo que debe heredar la clase AirUnit. El método de escritura de esta clase es similar al de Escuadrón o Grupo, la diferencia es que un Ala tiene 216 tipos de aviones. Para conocer los requisitos específicos y la implementación del código, consulte la parte de trabajo correspondiente del CD.

3. Esquema Diagrama UML

inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
El diagrama de clase de diseño del programa de diseño de este tema y otros diagramas:
inserte la descripción de la imagen aquí

4. Modo agregar código (implementación de lenguaje JAVA)

(1) clase de ala

package com.glut.xusheng;


/*=======================*/
/* 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++){
    
    
           // need 162 fighters
      }
       for(int k=0;k<18;k++){
    
    
           // need 18 bombers
      }
       for(int k=0;k<18;k++){
    
    
           // need 18 transporters
      }
       for(int k=0;k<18;k++){
    
    
           // need 18 eAirplanes
      }
    }

    public String getDescription(){
    
    
   return FEATURES;
    }

    public String fight(){
    
    
       return super.fight();
   }
}

(2) clase de GUI:

private String[] AirForceUnit = {
    
    "SQUADRON", "GROUP", "WING"};
add(1, 6, airCheckBox[13]);
else if ((m==13) && (ckBoxStates[13] == SELECTED)){
    
    
   unit = new Wing();
   airUnits.attach(unit);
   unitInfo = unit.getDescription();
}

5. Código general

(1) AirforceGUI y Clase A

Clase AirforceGUI

package com.glut.xusheng;

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"};
	//jia
	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);
	}
}

clase de la fuerza aérea

package com.glut.xusheng;

/*===================================*/
/* This is the interface of a class  */
/* hierarchy that is to be visited   */
/* by some visitors                  */
/*===================================*/

public abstract interface Airforce {
    
    
   public abstract String fight();
   public abstract String getDescription();
}

Clase AirUnit

package com.glut.xusheng;

import java.util.ArrayList;
import java.util.Iterator;

/*=====================================*/
/* This is the object structure  class */
/* in the class diagram of the visitor */
/* design pattern                      */
/*=====================================*/

public class AirUnit implements Airforce{
    
    

	private ArrayList<Airforce> parts;
	private String answer="";
	private String FEATURES = "Air Formation of Airforce. ";

	public AirUnit(){
    
    
		parts = new ArrayList<Airforce>();
    }

	public void attach(Airforce equip){
    
    
        if(equip != null)
		parts.add(equip);
    }

    public void detach(Airforce equip){
    
    
	    if(equip != null)
		    parts.remove(equip);
    }

	public Iterator<Airforce>  elements(){
    
    
	    return parts.iterator();
    }
	public String fight(){
    
    
		int len =parts.size();
		for (int i=0; i < len; i++){
    
    
			Airforce part = parts.get(i);
			answer = answer + part.fight()+"\n";
        }
        return answer;
	}

	public int getSize(){
    
    
	    return parts.size();
    }

    public String getDescription(){
    
    
		    return FEATURES;
	}
}

(2) B1B, B2A, B52, Bombardero

categoría B1B

package com.glut.xusheng;/*================================*/
/* Represents a kind of airforce  */
/*================================*/

public class B1B extends Bomber{
    
    

	public static final String FEATURES = "B1B Lancer";


    public String getDescription(){
    
    
	    return FEATURES;
	}

	public String fight(){
    
    
		return FEATURES + " Ready to fight!";

	}

}

categoría B2A

package com.glut.xusheng;


/*================================*/
/* Represents a kind of airforce  */
/*================================*/

public class B2A extends Bomber{
    
    

	public static final String FEATURES = "B2A Spirit";


    public String getDescription(){
    
    
	    return FEATURES;
	}

	public String fight(){
    
    
		return FEATURES + " Ready to fight!";

	}

}

Categoría B52

package com.glut.xusheng;


public class B52 extends Bomber{
    
    

	public static final String FEATURES = "B52H StratoFortress";


    public String getDescription(){
    
    
	    return FEATURES;
	}

	public String fight(){
    
    
		return FEATURES + " Ready to fight!";

	}

}

clase de bombardero

package com.glut.xusheng;


/*================================*/
/* Represents a kind of airforce  */
/*================================*/

public abstract class Bomber implements Airforce{
    
    

	public static final String FEATURES = "Bombers ";


    public String getDescription(){
    
    
	    return FEATURES;
	}

	public abstract String fight();

}

(3) C130E, C130J, CV22

Clase C130E

package com.glut.xusheng;


public class C130E extends Transporter{
    
    

	public static final String FEATURES = "C130EH Hercules";


    public String getDescription(){
    
    
	    return FEATURES;
	}

	public String fight(){
    
    
		return FEATURES + " Ready to fight!";

	}

}

Clase C130J

package com.glut.xusheng;

public class C130J extends Transporter{
    
    

	public static final String FEATURES = "C130J Super Hercules";


    public String getDescription(){
    
    
	    return FEATURES;
	}

	public String fight(){
    
    
		return FEATURES + " Ready to fight!";

	}

}

clase CV22

package com.glut.xusheng;


public class CV22 extends Transporter{
    
    

	public static final String FEATURES = "CV22BO Sprey";


    public String getDescription(){
    
    
	    return FEATURES;
	}

	public String fight(){
    
    
		return FEATURES + " Ready to fight!";
	}

}

(4) E9A, EC130, EPlano

Clase E9A

package com.glut.xusheng;


/*================================*/
/* Represents a kind of airforce  */
/*================================*/

public class E9A extends EPlane{
    
    

	public static final String FEATURES = "E9A ";


    public String getDescription(){
    
    
	    return FEATURES;
	}

	public String fight(){
    
    
		return FEATURES + " Ready to fight!";

	}

}

Clase EC130

package com.glut.xusheng;



/*================================*/
/* Represents a kind of airforce  */
/*================================*/

public class EC130 extends EPlane{
    
    

	public static final String FEATURES = "EC130HJ Compass";


    public String getDescription(){
    
    
	    return FEATURES;
	}

	public String fight(){
    
    
		return FEATURES + " Ready to fight!";

	}

}

clase de avión

package com.glut.xusheng;

/*================================*/
/* Represents a kind of airforce  */
/*================================*/

public abstract class EPlane implements Airforce{
    
    

	public static final String FEATURES = "EPlanes ";


    public String getDescription(){
    
    
	    return FEATURES;
	}

	public abstract String fight();

}

(5) F15, F16, F22, Caza

categoría F15

package com.glut.xusheng;

/*================================*/
/* Represents a kind of airforce  */
/*================================*/

public class F15 extends Fighter{
    
    

	public static final String FEATURES = "F15E Strike Eagle";


    public String getDescription(){
    
    
	    return FEATURES;
	}

	public String fight(){
    
    
		return FEATURES + " Ready to fight!";

	}

}

clase F16

package com.glut.xusheng;/*================================*/
/* Represents a kind of airforce  */
/*================================*/

public class F16 extends Fighter{
    
    

	public static final String FEATURES = "F16CD Fighting Falcon";


    public String getDescription(){
    
    
	    return FEATURES;
	}

	public String fight(){
    
    
		return FEATURES + " Ready to fight!";

	}

}

categoría F22

package com.glut.xusheng;

/*================================*/
/* Represents a kind of airforce  */
/*================================*/

public class F22 extends Fighter{
    
    

	public static final String FEATURES = "F22A Rapter";


    public String getDescription(){
    
    
	    return FEATURES;
	}

	public String fight(){
    
    
		return FEATURES + " Ready to fight!";

	}

}

Clase de luchador

package com.glut.xusheng;

/*================================*/
/* Represents a kind of airforce  */
/*================================*/

public abstract class Fighter implements Airforce{
    
    

	public static final String FEATURES = "Fighter Airplanes";


    public String getDescription(){
    
    
	    return FEATURES;
	}

	public abstract String fight();

}

(6) Grupo, Escuadrón, Transportador

clase de grupo

package com.glut.xusheng;/*=======================*/
/* Represents an air Group    */
/*=======================*/

public class Group extends AirUnit{
    
    

    public static final String FEATURES = "A Group with 72 aircrafts";
    Airforce[] fighters = new Airforce[54];
    Airforce[] bombers = new Airforce[6];
    Airforce[] transporters= new Airforce[6];
    Airforce[] eAircrafts = new Airforce[6];

    public Group(){
    
    
       for(int k=0;k<54;k++){
    
    
           fighters[k] = new F22();
           super.attach(fighters[k]);
	   }
       for(int k=0;k<6;k++){
    
    
           bombers[k] = new B52();
           super.attach(bombers[k] );
	   }
       for(int k=0;k<6;k++){
    
    
           transporters[k] = new C130J();
	       super.attach(transporters[k]);
	   }
       for(int k=0;k<6;k++){
    
    
            eAircrafts[k] = new E9A();
            super.attach(eAircrafts[k]);
	   }
    }

    public String getDescription(){
    
    
	return FEATURES;
    }

    public String fight(){
    
    
	    return super.fight();
	}
}

clase de escuadrón

package com.glut.xusheng;
/*==========================*/
/* Represents an air Squadron    */
/*==========================*/

public class Squadron extends AirUnit{
    
    

    public static final String FEATURES = "A Quadron with 24 aircrafts";
    Airforce[] fighters = new Airforce[18];
    Airforce[] bombers = new Airforce[2];
    Airforce[] transporters= new Airforce[2];
    Airforce[] eAircrafts = new Airforce[2];

    public Squadron(){
    
    
       for(int k=0;k<18;k++){
    
    
           fighters[k] = new F22();
           super.attach(fighters[k]);
	   }
       for(int k=0;k<2;k++){
    
    
           bombers[k] = new B52();
           super.attach(bombers[k] );
	   }
       for(int k=0;k<2;k++){
    
    
           transporters[k] = new C130J();
	       super.attach(transporters[k]);
	   }
       for(int k=0;k<2;k++){
    
    
            eAircrafts[k] = new E9A();
            super.attach(eAircrafts[k]);
	   }
    }

    public String getDescription(){
    
    
	return FEATURES;
    }

    public String fight(){
    
    
	    return super.fight();
	}
}

clase de transportador

package com.glut.xusheng;

/*================================*/
/* Represents a kind of airforce  */
/*================================*/

public abstract class Transporter implements Airforce{
    
    

	public static final String FEATURES = "Transporters ";

    public String getDescription(){
    
    
	    return FEATURES;
	}

	public abstract String fight();
}

6. Ejecución de resultados

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

7. Resumen del experimento

(1) Definición de Patrón Compuesto:
a veces llamado modo Parte-Todo, es un modo que combina objetos en una jerarquía similar a un árbol, que se usa para representar "partes enteras" La relación entre el usuario tiene acceso consistente a un solo objeto y un objeto compuesto, que pertenece al patrón de diseño estructural.
El modo de combinación se usa generalmente para describir la relación entre el todo y la parte. Organiza los objetos en una estructura de árbol. El nodo de nivel superior se denomina nodo raíz. El nodo raíz puede contener nodos de rama y nodos de hoja, y la rama Los nodos pueden contener nodos de rama y nodos de hoja, el diagrama de estructura de árbol es el siguiente.
El modo de combinación se divide en tres funciones:
inserte la descripción de la imagen aquí

1. Componente (componente abstracto): la clase principal heredada por el componente de hoja y el componente de contenedor o la interfaz implementada juntos, esta función incluye la declaración e implementación de los métodos comunes de todas las subclases, y el método de gestión de subcomponentes es definido en el componente abstracto, para agregar componentes, eliminar componentes y obtener componentes.
2. Hoja (componente de hoja): indica un nodo de hoja sin nodos secundarios. El método de gestión de los nodos secundarios heredados de la clase principal se maneja lanzando una excepción.
3. Compuesto (componente contenedor): representa un nodo contenedor, incluidos los subnodos, los subnodos pueden ser nodos contenedores o nodos hoja, proporciona un conjunto para mantener los subnodos y procesar los subnodos de manera iterativa.
La clave del modo de combinación es la clase de componente abstracto, que puede representar tanto el nodo hoja como el nodo contenedor. Para el cliente, el componente abstracto se procesa de manera uniforme. La clase de componente abstracto y la clase de componente contenedor se agregan y asocian. componente abstracto La clase es parte de la clase de componente contenedor, por lo que la clase de componente contenedor no necesita distinguir si es un nodo hoja o un nodo contenedor al procesar subcomponentes, y puede manejarlo de manera uniforme.

(2) Precauciones y detalles del modo combinado:

1. Simplificar las operaciones de los clientes. Los clientes solo necesitan tratar con objetos consistentes sin considerar partes enteras o hojas de nodos.
2. Tiene una fuerte escalabilidad. Cuando queremos cambiar el objeto combinado, solo necesitamos ajustar la relación jerárquica interna, y el cliente no necesita hacer ningún cambio 3.
Es conveniente crear una estructura jerárquica compleja. El cliente no necesita preocuparse por los detalles de composición en la combinación y puede agregar fácilmente nodos u hojas para crear una estructura de árbol compleja.
4. Cuando es necesario recorrer la organización, o cuando los objetos procesados ​​tienen una estructura de árbol, es muy adecuado utilizar el modo de combinación.
5. Se requiere una alta abstracción.Si hay muchas diferencias entre los nodos y las hojas, como muchos métodos y atributos, no es adecuado utilizar el modo de combinación.

Supongo que te gusta

Origin blog.csdn.net/m0_52435951/article/details/125070800
Recomendado
Clasificación