一個層次風格的系統按照層次結構組織,每一層爲上層服務,並作爲下層的用戶。
在層次風格的系統中,內部的層只對相鄰的層可見,交互只在相鄰的層次之間發生,同時這些交互按照一定的協議進行。
程序示例如下:
【功能】:輸入三角形三條邊計算面積或周長。
【代碼】:
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()方法將一個小數結果返回給第一層。