軟件體系結構——層次風格

  一個層次風格的系統按照層次結構組織,每一層爲上層服務,並作爲下層的用戶。

 在層次風格的系統中,內部的層只對相鄰的層可見,交互只在相鄰的層次之間發生,同時這些交互按照一定的協議進行。

程序示例如下:

【功能】:輸入三角形三條邊計算面積或周長。

【代碼】:

TestingGUI.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class TestingGUI extends JFrame implements ActionListener{
	Choose ch1,ch2;
	JTextField textA,textB,textC;
	JTextArea showArea;
	JButton controlButton,controlButton1;
	TestingGUI(){
		init();
		setVisible(true);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
      void init(){
    	  ch1=new Mianji();
    	  ch2=new Zhouchang();
    	  textA=new JTextField(5);
    	  textB=new JTextField(5);
    	  textC=new JTextField(5);
          showArea=new JTextArea();
          controlButton=new JButton("計算面積");
          controlButton1=new JButton("計算周長");
          JPanel pNorth=new JPanel();
          pNorth.add(new JLabel("邊A:"));
          pNorth.add(textA);
          pNorth.add(new JLabel("邊B:"));
          pNorth.add(textB);
          pNorth.add(new JLabel("邊C:"));
          pNorth.add(textC);
          pNorth.add(controlButton);
          pNorth.add(controlButton1);
          controlButton.addActionListener(this);
          controlButton1.addActionListener(this);
          add(pNorth,BorderLayout.NORTH);
          add(new JScrollPane(showArea),BorderLayout.CENTER);
      }
      public void actionPerformed(ActionEvent e){
    	  String s=e.getActionCommand();
    	  try{
    		  double a=Double.parseDouble(textA.getText().trim());
    		  double b=Double.parseDouble(textB.getText().trim());
    		  double c=Double.parseDouble(textC.getText().trim());
    		  if(s.equals("計算面積")){
    		  ch1.setA(a);
    		  ch1.setB(b);
    		  ch1.setC(c);
    		  String area=ch1.getResult();
    		  showArea.append("三角形"+a+","+b+","+c+"的面積:") ;
    		  showArea.append(area+"\n");
    		  }
    		  else if(s.equals("計算周長")){
        		  ch2.setA(a);
        		  ch2.setB(b);
        		  ch2.setC(c);
        		  String area=ch2.getResult();
        		  showArea.append("三角形"+a+","+b+","+c+"的周長:") ;
        		  showArea.append(area+"\n");
        		  }
    	  }
    	  catch (Exception ex){
    		  showArea.append("\n"+ex+"\n");
    		  
    	  }
      }
      public static void main(String args[]){
    	  TestingGUI win=new TestingGUI();
    		win.setBounds(100,100,620,300);
    		}

Choose.java
public interface Choose {
	public abstract String getResult();
	public void setA(double a);
	public void setB(double b);
	public void setC(double c);
}
Mianji.java
public   class Mianji implements Choose {
	double sideA,sideB,sideC,area;
	boolean isTriangle;
	public String getResult(){
		if(isTriangle){
			double p=(sideA+sideB+sideC)/2.0;
			area=Math.sqrt(p*(p-sideA)*(p-sideB)*(p-sideC));
			return String.valueOf(area);
		}
		else {
			return "無法計算面積";
		}
	}
	public void setA(double a){
		sideA=a;
		if(sideA+sideB>sideC&&sideA+sideC>sideB&&sideC+sideB>sideA)
        isTriangle=true;
		else
			 isTriangle=false;
	}
	public void setB(double b){
		sideB=b;
		if(sideA+sideB>sideC&&sideA+sideC>sideB&&sideC+sideB>sideA)
        isTriangle=true;
		else
			 isTriangle=false;
	}
	public void setC(double c){
		sideC=c;
		if(sideA+sideB>sideC&&sideA+sideC>sideB&&sideC+sideB>sideA)
        isTriangle=true;
		else
			 isTriangle=false;
	}
}

Zhouchang.java

public   class Zhouchang implements Choose {
	double sideA,sideB,sideC,length;
	boolean isTriangle;
	public String getResult(){
		if(isTriangle){
			length=sideA+sideB+sideC;
			return String.valueOf(length);
		}
		else {
			return "無法計算周長";
		}
	}
	public void setA(double a){
		sideA=a;
		if(sideA+sideB>sideC&&sideA+sideC>sideB&&sideC+sideB>sideA)
        isTriangle=true;
		else
			 isTriangle=false;
	}
	public void setB(double b){
		sideB=b;
		if(sideA+sideB>sideC&&sideA+sideC>sideB&&sideC+sideB>sideA)
        isTriangle=true;
		else
			 isTriangle=false;
	}
	public void setC(double c){
		sideC=c;
		if(sideA+sideB>sideC&&sideA+sideC>sideB&&sideC+sideB>sideA)
        isTriangle=true;
		else
			 isTriangle=false;
	}
	
}

組件:第一層裏的TestingGUI類,第二層的Choose接口,Mianji類,Zhouchang類。

連接件: ①在第一層TestingGUI類中聲明瞭第二層Mianji類和Zhouchang類的對象。並調用他們的setA(),setB(),setC()和getResult()方法,第二層的getResult()方法將一個小數結果返回給第一層。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章