現在很多JAVA書籍,在介紹SWING的事件模型時,為了使JAVA初學者容易理解和上手,通常是在主類(自己的JFrame子類或JPanel)中做所有事情:要麼由主類作為監聽器,在介面的方法中通過判定事件來源來決定具體做何事;要麼在主類中使用內隱類來實現監聽器,(因為內隱類可以方便的訪問主類中的成員變數)。而很多JAVA初學者在往後的編程中也採用這種模式(至少我以前是這樣的)。其實,這種做法雖然簡單,卻缺乏可讀性、可擴充性和可維護性。之前我看到了一篇關於這個問題的文章(來自於《JavaPro》),現整理出來與大家分享。
下面我將用一個簡單的例子來說明如何使用模式來解決這個問題。
現在,假設我們要編寫一個使用幾個選項按鈕從一個長列表中選擇不同分組的程式,就象下圖中看到的。單擊Female選項按鈕時,只有女孩的名字被顯示;當你點擊Male按鈕時,程式顯示男孩的名字。
這個程式最簡單的版本是在主類中做每件事情,主類包含一些持有孩子姓名的數組和向量(Vector),一個另一個最簡單的方法是為每個孩子建立一個對象,每個對象有一個象isFemal()這樣的方法來協助我們確定要顯示的是男的還是女的。在程式中我們把每個孩子的類稱為Swimmer:
public class Swimmer{
private String name;
private int age;
private String club;
private boolean female;
public Swimmer(String name,int age,String club,boolean female){
this.name=name;
this.age=age;
this.club=club;
this.female=female;
}
public boolean isFemale(){
return female;
}
public String getName(){
return name;
}
public int getAge(){
return age;
}
public String getClub(){
return club;
}
}