实验九 外观模式的应用

实验目的
1 掌握外观模式(Facade)的特点
2 分析具体问题,使用外观模式进行设计。
实验内容和要求
作业3.3-1
在光盘的附加例子3.3的设计中,添加一个新的Tuition(学费)类。该类负责从一个文件中读出学生的学费缴纳情况。该类已经写好,与其他类在同一个文件夹中。要求在外观类StudentInfoFacade中实现extractTuitionInfo()方法,并且在该类合适的地方调用该方法,以便实现在用户界面,除了显示学生基本信息、学习科目与成绩、获奖情况的同时,也显示学生各学期的学费缴纳情况。具体要求与代码参见书后光盘的作业部分。

【模式UML图】
在这里插入图片描述

【模式代码(JAVA语言实现)】
AcademicRecord.java

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;

public class AcademicRecord {
  private String firstName;
  private String lastName;
  private String studNum;
  //private String courseName;
  //private String courseNumber;
  //private String courseScore;
  private String aFile;

  private ArrayList<StudentAcademicModel> allScores;

  //constructor
  public AcademicRecord(String firstName, String lastName, String studNum ) {
      this.firstName = firstName;
      this.lastName = lastName;
      this.studNum = studNum;
  }

  //Get basic student academic information from a text file that is
  //passed in from the parameter
  public ArrayList<StudentAcademicModel> getAllScores(String file){
        aFile = file;
        allScores = new ArrayList();
        try {
           BufferedReader reader = new BufferedReader(new FileReader(aFile));
           String line = reader.readLine();
           while(line != null) {
  			if (line.length() != 0) {
  		      String[] arr = line.split("\\,");
  	          StudentAcademicModel sdam = new StudentAcademicModel (arr[0].trim(), arr[1].trim(),
  	                                                                                                                               arr[2].trim(), arr[3].trim(),
  	                                                                                                                               arr[4].trim(), arr[5].trim());
  	          if( sdam.getStudFirstName().equals(firstName) &&
  	              sdam.getStudLastName().equals(lastName) &&
  	              sdam.getStudSerialNum().equals(studNum) )

  			      allScores.add(sdam);
  			}
  			line = reader.readLine();
            }
         }
         catch(FileNotFoundException exc){
            exc.printStackTrace();
            System.exit(1);
         }
         catch(IOException exc){
            exc.printStackTrace();
            System.exit(1);
         }
         return allScores;
     }

  public String getFirstName() {
    return firstName;
  }
  public String getLastName() {
    return lastName;
  }
  public String getStudNumber() {
      return studNum;
  }
}

Award.java

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;

public class Award {
	  private String firstName;
	  private String lastName;
	  private String studNum;
	  private String aFile;
	  private ArrayList<StudentAwardModel> allAwards;

	 //constructor
	  public Award(String fname, String lname, String stuNum) {
		firstName = fname;
		lastName = lname;
		studNum = stuNum;
	  }

    //Get basic student awards information from a text file that is
    //passed in from the parameter
	public ArrayList<StudentAwardModel> getAllAwards(String file){
		  aFile = file;
		  allAwards = new ArrayList();
		  try {
			 BufferedReader reader = new BufferedReader(new FileReader(aFile));
			 String line = reader.readLine();
			 while(line != null) {
				if (line.length() != 0) {
				  String[] arr = line.split("\\,");
				  StudentAwardModel sdam = new StudentAwardModel (arr[0].trim(), arr[1].trim(),
				                                                                                                          arr[2].trim(),arr[3].trim(),
				                                                                                                          arr[4].trim());
				  if( sdam.getStudFirstName().equals(firstName) &&
					  sdam.getStudLastName().equals(lastName) &&
					  sdam.getStudSerialNum().equals(studNum) )

					  allAwards.add(sdam);
				}
				line = reader.readLine();
			  }
		   }
		   catch(FileNotFoundException exc){
			  exc.printStackTrace();
			  System.exit(1);
		   }
		   catch(IOException exc){
			  exc.printStackTrace();
			  System.exit(1);
		   }
		   return allAwards;
	   }

	  public String getFirstName() {
		return firstName;
	  }
	  public String getLastName() {
		return lastName;
	  }
	  public String getStudNumber() {
		  return studNum;
	  }
}

ClientGUI.java

public class ClientGUI extends JFrame {
    private JSplitPane bigSplitPane;
    private JScrollPane showInfoPane;
    private JPanel btnPanel;
    private JComboBox cmbAlgorithm, cmbHouseType;
    private JLabel lblFirstName;
    private JLabel lblLastName;
    private JLabel lblSerialNum;
    private Dimension minimumSize;
    private JTextArea txtStudentInfo;
    private JTextField txtFirstName;
    private JTextField txtLastName;
    private JTextField txtSerialNum;

    private StudentInfoFacade infoFacade;

    public static final String PRINT = "Print";
    public static final String EXIT = "Exit";

    public ClientGUI() {
        super("Facade Pattern- Student information system ");
        minimumSize = new Dimension(130, 100);
        setUpChoicePanel();
        setUpScrollPanes();
    }

    private void setUpChoicePanel() {
        JLabel lblToBeSorted = new JLabel("Input Integers");
        txtFirstName = new JTextField(20);
        txtLastName = new JTextField(20);
        txtSerialNum = new JTextField(20);

        lblFirstName = new JLabel("First Name");
        lblLastName = new JLabel("Last Name");
        lblSerialNum = new JLabel("Serial Number");

        //Create buttons
        JButton openButton = new JButton(PRINT);
        openButton.setMnemonic(KeyEvent.VK_S);
        JButton exitButton = new JButton(EXIT);
        exitButton.setMnemonic(KeyEvent.VK_X);

        ButtonListener btnListener = new ButtonListener();

        // add action Listener
        openButton.addActionListener(btnListener);
        exitButton.addActionListener(btnListener);

        btnPanel = new JPanel();

        //------------------------------------------------
        GridBagLayout gridbag = new GridBagLayout();
        btnPanel.setLayout(gridbag);
        GridBagConstraints gbc = new GridBagConstraints();

        btnPanel.add(lblFirstName);
        btnPanel.add(lblLastName);
        btnPanel.add(lblSerialNum);

        btnPanel.add(txtFirstName);
        btnPanel.add(txtLastName);
        btnPanel.add(txtSerialNum);
        btnPanel.add(openButton);
        btnPanel.add(exitButton);

        gbc.insets.top = 5;
        gbc.insets.bottom = 5;
        gbc.insets.left = 5;
        gbc.insets.right = 5;

        gbc.gridx = 0;
        gbc.gridy = 0;
        gridbag.setConstraints(lblFirstName, gbc);
        gbc.gridx = 1;
        gbc.gridy = 0;
        gridbag.setConstraints(txtFirstName, gbc);
        gbc.gridx = 0;
        gbc.gridy = 1;
        gridbag.setConstraints(lblLastName, gbc);
        gbc.gridx = 1;
        gbc.gridy = 1;
        gridbag.setConstraints(txtLastName, gbc);
        gbc.gridx = 0;
        gbc.gridy = 2;
        gridbag.setConstraints(lblSerialNum, gbc);
        gbc.gridx = 1;
        gbc.gridy = 2;
        gridbag.setConstraints(txtSerialNum, gbc);

        gbc.insets.left = 2;
        gbc.insets.right = 2;
        gbc.insets.top = 15;
        gbc.gridx = 0;
        gbc.gridy = 7;
        gridbag.setConstraints(openButton, gbc);
        gbc.anchor = GridBagConstraints.WEST;
        gbc.gridx = 1;
        gbc.gridy = 7;
        gridbag.setConstraints(exitButton, gbc);
        //-----------------------------------------------
    }

    private void setUpScrollPanes() {
        Border raisedbevel = BorderFactory.createRaisedBevelBorder();

        txtStudentInfo = new JTextArea("Student report: \n", 20, 30);
        txtStudentInfo.setFont(new Font("Helvetica", Font.BOLD, 12));
        txtStudentInfo.setBackground(Color.cyan);

        showInfoPane = new JScrollPane(txtStudentInfo);

        bigSplitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, btnPanel, showInfoPane);
        bigSplitPane.setDividerLocation(230);

        getContentPane().add(bigSplitPane);
        setSize(new Dimension(500, 400));
        setVisible(true);
    }

    class ButtonListener implements ActionListener {
        public void actionPerformed(ActionEvent ae) {

            if (ae.getActionCommand().equals(EXIT)) {
                System.exit(1);
            }

            if (ae.getActionCommand().equals(PRINT)) {
                String firstName = txtFirstName.getText().trim();
                String lastName = txtLastName.getText().trim();
                String studentNum = txtSerialNum.getText().trim();

                infoFacade = new StudentInfoFacade(firstName, lastName, studentNum);
                String studentInfo = infoFacade.getStudentInfo();
                txtStudentInfo.append(" " + studentInfo + " \n");

            }
        }
    }

    public static void main(String args[]) {
        try {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
        } catch (Exception evt) {
        }

        ClientGUI frame = new ClientGUI();
        frame.addWindowListener(new WindowAdapter() {
                                    public void windowClosing(WindowEvent e) {
                                        System.exit(0);
                                    }
                                }
        );
        frame.setSize(500, 400);
        frame.setVisible(true);
    }
}

StudentAcademicModel.java

public class StudentAcademicModel {
   private String studFirstName;
   private String studLastName;
   private String studSerialNum;
   private String courseTitle;
   private String courseNum;
   private String score;

   public StudentAcademicModel (String studFirstName, String studLastName, String studSerialNum,
                                                      String courseTitle, String courseNum, String score) {
      this.studFirstName = studFirstName;
      this.studLastName = studLastName;
      this.studSerialNum = studSerialNum;
      this.courseTitle = courseTitle;
      this.courseNum = courseNum;
      this.score=score;
   }

   public String getStudFirstName() {
      return studFirstName;
   }
   public String getStudLastName() {
      return studLastName;
   }
   public String getStudSerialNum() {
      return studSerialNum;
   }
   public String getCourseTitle() {
      return courseTitle;
   }
   public String getCourseNum() {
         return courseNum;
   }
   public String getScore() {
            return score;
   }
}

StudentAwardModel.java

public class StudentAwardModel {
   private String studFirstName;
   private String studLastName;
   private String studSerialNum;
   private String awardName;
   private String awardDate;

   public StudentAwardModel (String studFirstName, String studLastName, String studSerialNum,
                                                         String awardName, String awardDate) {
      this.studFirstName = studFirstName;
      this.studLastName = studLastName;
      this.studSerialNum = studSerialNum;
      this.awardName = awardName;
      this.awardDate = awardDate;
   }

   public String getStudFirstName() {
      return studFirstName;
   }
   public String getStudLastName() {
      return studLastName;
   }
   public String getStudSerialNum() {
      return studSerialNum;
   }
   public String getAwardName() {
      return awardName;
   }
   public String getAwardDate() {
         return awardDate;
   }
}

StudentBasicInfo.java

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;

public class StudentBasicInfo {
	  private String name;
	  private String birthDate;
	  private String serialNum;
	  private ArrayList<StudentBasicInfoModel> student;
	  final static String STUDENT_BASIC_INFO = "StudentBasicInfo.txt";

	 //Constructor
	  public StudentBasicInfo (String name, String birthDate, String serialNum) {
		  this.name = name;
		  this.birthDate = birthDate;
		  this.serialNum = serialNum;
	  }

	  //Check if the student name is in the student list or not
	  public static boolean isExistingStudentName(String name) {
		 boolean flag = false;
		 ArrayList<StudentBasicInfoModel> student = new ArrayList();
				try {
				   BufferedReader reader = new BufferedReader(new FileReader(STUDENT_BASIC_INFO));
				   String line = reader.readLine();
				   while(line != null) {
					if (line.length() != 0) {
					  String[] arr = line.split("\\,");
					  if( arr[0].trim().equals(name))
							flag = true;
					}
					line = reader.readLine();
					}
				 }
				 catch(FileNotFoundException exc){
					exc.printStackTrace();
					System.exit(1);
				 }
				 catch(IOException exc){
					exc.printStackTrace();
					System.exit(1);
			 }
		return flag;
	  }

      //Get basic student information from STUDENT_BASIC_INFO
      //and return it with type ArrayList<StudentBasicInfoModel>
	  public ArrayList<StudentBasicInfoModel> getStudentBasicInfo(){
			student = new ArrayList();
			try {
			   BufferedReader reader = new BufferedReader(new FileReader(STUDENT_BASIC_INFO));
			   String line = reader.readLine();
			   while(line != null) {
				if (line.length() != 0) {
				  String[] arr = line.split("\\,");
				  StudentBasicInfoModel  bsim = new StudentBasicInfoModel  (arr[0].trim(), arr[1].trim(),
																																	   arr[2].trim(),arr[3].trim(),
																																	   arr[4].trim(), arr[5].trim());
				  if( bsim.getName().equals(name) && bsim.getSerialNum().equals(serialNum) )
					  student.add(bsim);
				}
				line = reader.readLine();
				}
			 }
			 catch(FileNotFoundException exc){
				exc.printStackTrace();
				System.exit(1);
			 }
			 catch(IOException exc){
				exc.printStackTrace();
				System.exit(1);
			 }
			 return  student;
		 }

	  public String getName() {
		return name;
	  }
	  public String getBirthDate() {
		return birthDate;
	  }
	  public String getSerialNum() {
		  return serialNum;
	  }
}

StudentBasicInfoModel.java

public class StudentBasicInfoModel{
   private String name;
   private String birthDate;
   private String serialNumber;
   private String ssNumber;
   private String major;
   private String degree;

   public StudentBasicInfoModel(String name, String birthDate, String serialNumber,
                                 String ssNumber, String major, String degree) {
      this.name = name;
      this.birthDate = birthDate;
      this.serialNumber = serialNumber;
      this.ssNumber = ssNumber;
      this.major = major;
      this.degree = degree;
   }

   public String getName() {
      return name;
   }
   public String getBirthDate() {
      return birthDate;
   }
   public String getSerialNum() {
      return serialNumber;
   }
   public String getSocialSecurityNum() {
      return ssNumber;
   }
   public String getMajor() {
         return major;
   }
   public String getDegree() {
            return degree;
   }
}

StudentInfoFacade.java

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

public class StudentInfoFacade {
    private String firstName;
    private String lastName;
    private String studentNum;
    private StudentBasicInfo studentInfo;
    private AcademicRecord academicRecord;
    private Award award;
    private Tuition tuition;
    private final String AWARDS = "StudentAward.txt";
    private final String RECORDS = "StudentAcademicRecord.txt";

    public StudentInfoFacade(String firstName, String lastName, String studentNum) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.studentNum = studentNum;
    }

    // Get comprehensive student information by calling 3 methods
    // in this class, including basic student information, student
    // academic records, and possible awards info. Client class can
    // just call this method to get all the information.
    public String getStudentInfo() {
        String nm = firstName + " " + lastName;
        if (StudentBasicInfo.isExistingStudentName(nm) == false) {
            String msg = "The student with the name doesn't exist.";
            return msg;
        }

        String allInfo = null;
        String info = extractStudentInfo();
        String record = extractAcademicRecord();
        String awards = extractAllAwards();
//add codes
        String tuitionInfo = extractTuitionInfo();

        allInfo = "\nBasic Student Info: \n" + info + "\nAcademic record: \n" + record + "\nAwards: \n" + awards + "\nTuition: \n" + tuitionInfo;
        return allInfo;
    }

    //Extract basic student information from a file, which is called from
    //class StudentBasicInfo
    public String extractStudentInfo() {
        String allInfo = " ";
        String name = firstName + " " + lastName;
        studentInfo = new StudentBasicInfo(name, "1600", studentNum);
        ArrayList<StudentBasicInfoModel> basicInfo = studentInfo.getStudentBasicInfo();

        Iterator infoIterator = basicInfo.iterator();
        while (infoIterator.hasNext()) {
            StudentBasicInfoModel infoModel = (StudentBasicInfoModel) infoIterator.next();
            String nm = infoModel.getName().trim();
            String birth = infoModel.getBirthDate().trim();
            String studNum = infoModel.getSerialNum().trim();
            String ssn = infoModel.getSocialSecurityNum().trim();
            String mj = infoModel.getMajor().trim();
            String degree = infoModel.getDegree().trim();

            allInfo = allInfo + " " + nm + " " + birth + " " + studNum + " " + ssn + " " + mj + " " + degree + "\n";
        }
        return allInfo;
    }

    //Extract academic records from text file RECORDS, accessed from this method
    public String extractAcademicRecord() {
        String allInfo = " ";

        academicRecord = new AcademicRecord(firstName, lastName, studentNum);
        ArrayList<StudentAcademicModel> records = academicRecord.getAllScores(RECORDS);
        Iterator recordIterator = records.iterator();

        while (recordIterator.hasNext()) {
            StudentAcademicModel recordModel = (StudentAcademicModel) recordIterator.next();
            String name = recordModel.getStudFirstName().trim();
            String birth = recordModel.getStudLastName().trim();
            String studNum = recordModel.getStudSerialNum().trim();

            String coarseName = recordModel.getCourseTitle().trim();
            String courseNo = recordModel.getCourseNum().trim();
            String score = recordModel.getScore().trim();

            allInfo = allInfo + " " + name + " " + birth + " " + studNum + " " + coarseName + " " + courseNo + " " + score + "\n";
        }
        return allInfo;
    }

    //Extract student awards from text  file AWARDS, accessed from this method
    public String extractAllAwards() {
        String allInfo = " ";
        award = new Award(firstName, lastName, studentNum);
        ArrayList<StudentAwardModel> awd = award.getAllAwards(AWARDS);
        Iterator awardIterator = awd.iterator();

        while (awardIterator.hasNext()) {
            StudentAwardModel awardModel = (StudentAwardModel) awardIterator.next();

            String firstNm = awardModel.getStudFirstName().trim();
            String lastNm = awardModel.getStudLastName().trim();
            String studNum = awardModel.getStudSerialNum().trim();
            String awardName = awardModel.getAwardName().trim();
            String awadDate = awardModel.getAwardDate().trim();

            allInfo = allInfo + " " + firstNm + " " + lastNm + " " + studNum + " " + awardName + " " + awadDate + "\n";
        }
        return allInfo;
    }

    // Students are supposed to finish this homework
    public String extractTuitionInfo() {
        String allInfo = " ";
        Tuition tuition = new Tuition(firstName, lastName, studentNum);
        ArrayList<String> studentTuitionInfo = tuition.getStudentTuitionInfo();

        Iterator<String> iterator = studentTuitionInfo.iterator();

        while (iterator.hasNext()) {
            String next = iterator.next();
            allInfo += (next + "\n");
        }
        // Students are supposed to finish this part
        return allInfo;
    }
}

添加类Tuition.java

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;

public class Tuition {
    private String firstName;
    private String lastName;
    private String studNum;
    private final String STUDENT_TUITION_FILE = "Tuition.txt";
    private ArrayList<String> studentTuition;

    //constructor
    public Tuition(String fname, String lname, String stuNum) {
        firstName = fname;
        lastName = lname;
        studNum = stuNum;
    }

    //Get tuition information paid by students
    public ArrayList<String> getStudentTuitionInfo() {
        studentTuition = new ArrayList();
        try {
            BufferedReader reader = new BufferedReader(new FileReader(STUDENT_TUITION_FILE));
            String line = reader.readLine();
            while (line != null) {
                if (line.length() != 0) {
                    String[] arr = line.split("\\,");

                    if (arr[0].trim().equals(firstName) && arr[1].trim().equals(lastName) && arr[2].trim().equals(studNum))
                        studentTuition.add(line);
                }
                line = reader.readLine();
            }
        } catch (FileNotFoundException exc) {
            exc.printStackTrace();
            System.exit(1);
        } catch (IOException exc) {
            exc.printStackTrace();
            System.exit(1);
        }
        return studentTuition;
    }

    public String getFirstName() {
        return firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public String getStudNumber() {
        return studNum;
    }
}

【运行截图】
在这里插入图片描述

【实验小结】
通过本次实验,学会了使用外观模式。外观方法模式的适用性如下:
1)当要为访问一系列复杂的子系统提供一个简单入口时可以使用外观模式。

2)客户端程序与多个子系统之间存在很大的依赖性。引入外观类可以将子系统与客户端解耦,从而提高子系统的独立性和可移植性。

3)在层次化结构中,可以使用外观模式定义系统中每一层的入口,层与层之间不直接产生联系,而通过外观类建立联系,降低层之间的耦合度。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.参照Windows系统提供的计算器功能,制作一个自己的计算器,至少能完成数据的加减乘除的基本功能。 2.控件的焦点以及Tab键的设置和使用 3.多个控件(按钮)事件的共享 4.键盘的事件的应用 创建主体框架:主要是对计算器的外观进行手动的设计,系统自动生成界面的主要窗口生成代码。对于每个按钮的的代码段,分别添加事件触发的处理代码,在label标签,显示输入的信息和显示处理后的结果。 其标签的上面显示的是运算式子,下面是当前输入或者是结果。 数字1-9的按键的事件处理都是在label标签分别添加相对应的数字字符,把数字当成是字符串处理。对于加减乘除四则运算按键,事件触发后的处理是在label标签显示相应的四则运算符,是清屏label标签的,按了“=”按键才开始运算并显示结果。 程序使用时是先把整个运算的式子输入到两个计数器,程序把这一表达式转化成字符串和double数值数组,运行四则运算函数,把字符从数组读出,根据所选的模式进行相应的运算。 数字0-9的优先级同级,加减同级,乘除、求模同级,由于它们相互之间的优先级有别,因此为了在运算处理当能够处理表达式当的不同的优先级的四则运算符时,就要采用数据结构当处理表达式的方法,对label当的信息进行处理通过相应的模式运算得到结果。    通常地,计算机组成原理当介绍的四则运算算法一般如下,在计算器编程当可以从获取可行的思想。四则运算算法的一般描述: 加法算法    首先假定两个操作数均为小数(其他情况可以看做这种情况的特殊情况)。 通过界面输入获得两个操作数的值; 若两个数同号,则将两个操作数的整数部分和小数部分分别对应逐位相加,从最低位开始,若此位上的数字大于10,则向前位进1,此位减10; 若两个数字异号,则将负数放在第二个操作数内,正数放在第一个操作数内,然后将两个操作数的整数部分和小数部分分别对应逐位相减,判断结果的正负,若是整数,则要完成进位操作,若是负数则要完成借位操作; 将计算结果保存并输出。 减法算法    首先通过界面输入两个操作数,然后调用令第二个操作数取相反数,调用加法函数就可以实现减法计算。 乘法算法    乘法的算法就是简单的按照一般的乘法计算方法来进行的。考虑一般情况,两个操作数均为小数,从低位到高位,依次用第二个操作数的每一位上的数字乘以第一个操作数,然后将得出的结果调用加法函数相加即得到乘法的最后结果。 除法算法    除法算法也是按照学学到的除法算法进行。建立如下的除法算法: 输入两个操作数; 若第二个操作数为0,则输出除数不能为0的出错信息; 若第二个操作数不是0,则将第二个操作数乘以适当的倍率使其整数化,第一个操作数也做相应的变化; 从高位到低位,依次寻找每一个位置上的商值(这个值在0到9之间),直到第一个操作数的末尾; 保存并输出结果。
上篇:软件设计模式子代码  【2.2】简单工厂方法模式-汽车保险  【2.3】工厂方法模式-汽车保险  【2.4】抽象工厂模式-房屋信息  【2.5】生成器模式-房屋信息  【2.6】单模式-互联网连接  【3.2】组合模式-五子棋代码  【3.3】组合模式-空军指挥系统  【3.4】组合模式-世界问候语  【3.7】适配器模式-客户信息验证  【3.8】对象适配器模式-字符串排序  【3.10】外观模式-安全系统  【3.11】外观模式-椭圆功能  【3.13】桥接模式-茶水机系统  【3.14】桥接模式-几何立体体积  【4.1】迭代器模式-矩阵搜索  【4.2】迭代器模式-产品搜索  【4.4】访问者模式-名牌鞋销售软件  【4.5】访问者模式-计算机部件销售软件  【4.6】命令模式-室内温度控制  【4.7】命令模式-室内温度控制-2个GUI  【4.8】命令模式-室内温度控制-3个GUI  【4.10】介者模式-旅游信息共享  【4.11】介者模式-海岛机场  【4.13】策略模式-整数排序  【4.14】策略模式-国属相  【4.16】状态模式-交通信号灯-设计1  【4.16】状态模式-交通灯信号灯-设计2  【4.16】状态模式-交通灯信号灯-设计3 下篇:软件体系结构子代码  【6.4】结构化设计-文件更-C源代码  【6.5】面向对象设计架构-文件更  【6.7】顺序批处理架构-文件更  【6.8】顺序批处理架构-图像处理  【6.9】管道过滤器架构-主动过滤器  【6.10】管道过滤器架构-被动过滤器  【6.11】管道-过滤器架构-文件更  【6.12】管道-过滤器架构-图像处理程  【6.14】事件体系结构-鼠标响应  【6.17】事件体系结构-观察者模式-大草原1  【6.18】事件体系结构-观察者模式-大草原2  【6.19】事件体系结构-观察者模式-温度显示  【6.21】层次架构-软件测试  【6.22】层次架构-银行- Access数据库  【6.23】MVC架构-二手车拍卖-无观察者  【6.24】MVC架构-二手车拍卖-观察者-3个图形界面  【6.25】MVC架构-二手车拍卖-观察者-1个图形界面
饰模式: 装饰模式是一种结构型设计模式,它允许你通过将对象放入包含行为的特殊封装对象来为原对象绑定的行为。装饰模式的核心思想是:用装饰对象包装真实对象,从而在装饰对象上动态添加功能。装饰模式可以在不改变对象自身的基础上,在程序运行期间给对象动态地添加功能,这也是装饰模式的优点之一。 代理模式: 代理模式是一种结构型设计模式,它允许你提供一个代替品或占位符,以控制对其它对象的访问。代理模式的核心思想是:通过代理对象来控制对真实对象的访问,代理对象与真实对象实现相同的接口,客户端无需知道代理对象与真实对象的区别,从而达到客户端与真实对象解耦的目的。 桥接模式: 桥接模式是一种结构型设计模式,它可以将一个或一系列紧密相关的拆分为抽象和实现两个独立的层次结构,从而能在开发时分别使用。桥接模式的核心思想是:将抽象部分与实现部分分离,使它们可以独立地变化。这样一来,两者的变化不会相互影响,从而达到解耦的目的。 组合模式: 组合模式是一种结构型设计模式,它允许你将对象组合成树状结构,并且能像使用独立对象一样使用它们。组合模式的核心思想是:将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。 适配器模式: 适配器模式是一种结构型设计模式,它允许你将不兼容的对象包装在适配器,以使其与另一个兼容。适配器模式的核心思想是:将一个的接口转换成客户希望的另一个接口。适配器模式可以让原本由于接口不兼容而不能一起工作的可以一起工作。 外观模式外观模式是一种结构型设计模式,它为复杂的子系统提供一个简单的接口。外观模式的核心思想是:为子系统的一组接口提供一个一致的界面,以便于客户端使用。外观模式可以让客户端与子系统之间的耦合度降低,从而提高系统的可维护性和可扩展性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值