假設這樣一種情況,我們的系統的界面使用javax.swing包構建,界面的基礎是BaseView,他是一個容器,當然他應當提供獲取控件元素的功能,比如得到按鈕,下拉框,表格等,當然僅僅是一個容器而已,而我們的界面的元素全部部署在JPanel上。
描述為:
一個界面就是一個BaseView,他只包含一個JPanel,這個包含JPanel包含所有我們的Swing控件,例如JButton,JLable等等。
問題出現了:我們通常因為業務的需要完成一個界面的操作要自動跳轉到下一個界面,完成下一個界面又能跳回來(題外話:由於我們的操作是基於GUI的,所以往往能保存Session信息,而Web卻做不到),而這往往成為系統實現過程中效率低下的一個因素,我就見到我現在的系統中有人用600行代碼判斷上一個界面應該是哪一個來跳轉過來,因為很多界面都可以跳到當前界面。
當然有一種做法是,在下一個界面類中包含指向上一個界面的變量,我們說,這不方便,也增加了依賴性,這對軟件是不利的。
接下來,我給出我的解決方法,希望對采用這種界面結構的朋友有所裨益。
(以下全部用簡化模型來講述.)
1.簡單點,我們假設BaseView繼承JWindow,當然可以是別的容器(依據你的實現),大概象這樣:
public abstract class BaseView extends JWindow{
...
(實現一些取得界面控件,和界面信息的方法).
}
2.每個界面類都象這樣定義:
public class MyView extends BaseView{
JPanel myPanel;
public void playoutPanel(){
JButton myButton = new JButton("OK");
myPanel.add(myButton);
......
(添加你需要的控件和布局到myPanel上)
}
}
3.假設有其他的界面OneView,TwoView,ThreeView處理完操作後都需要跳轉到myView,在myView中的ok按鈕按下的時候需要回到原始界面。
原來臃腫的代碼需要在myView中添加一個變量BaseView anyView;用來存放轉來的那個界面anyView,賦值在三者中的跳轉代碼中引用myView來設定.跳轉代碼象這樣:
public void jump(){
MyView myView = new MyView();
myView.anyView = this;
this.remove(this.xxPanel);
this.add(myView.getPanel());
this.repaint();
}
看起來還不錯,雖然需要引用MyView類,並調用他的變量和方法.但是跳轉回來卻不那麼容易,否則怎麼會用600行!
大概象這樣:(這已經是被我簡化的)
public void goBack(){
if(anyView instanceof OneView){
anyView.remove(this.myView);
OneView ov = (OneView)anyView;
anyView.add(ov.getPanel());
anyView.repaint();
}
if(anyView instanceof TwoView){
....
}
...
}
不經大量應用別的業務用例界面,這種編譯依賴性真不是什麼好事,更何況用了大量的低效的instanceof判斷和轉型操作.