假設(shè)這樣一種情況,我們的系統(tǒng)的界面使用Javax.Swing包構(gòu)建,界面的基礎(chǔ)是BaseView,他是一個(gè)容器,當(dāng)然他應(yīng)當(dāng)提供獲取控件元素的功能,比如得到按鈕,下拉框,表格等,當(dāng)然僅僅是一個(gè)容器而已,而我們的界面的元素全部部署在JPanel上。
描述為:
一個(gè)界面就是一個(gè)BaseView,他只包含一個(gè)JPanel,這個(gè)包含JPanel包含所有我們的Swing控件,例如JButton,JLable等等。
問(wèn)題出現(xiàn)了:我們通常因?yàn)闃I(yè)務(wù)的需要完成一個(gè)界面的操作要自動(dòng)跳轉(zhuǎn)到下一個(gè)界面,完成下一個(gè)界面又能跳回來(lái)(題外話(huà):由于我們的操作是基于GUI的,所以往往能保存Session信息,而Web卻做不到),而這往往成為系統(tǒng)實(shí)現(xiàn)過(guò)程中效率低下的一個(gè)因素,我就見(jiàn)到我現(xiàn)在的系統(tǒng)中有人用600行代碼判斷上一個(gè)界面應(yīng)該是哪一個(gè)來(lái)跳轉(zhuǎn)過(guò)來(lái),因?yàn)楹芏嘟缑娑伎梢蕴疆?dāng)前界面。
當(dāng)然有一種做法是,在下一個(gè)界面類(lèi)中包含指向上一個(gè)界面的變量,我們說(shuō),這不方便,也增加了依賴(lài)性,這對(duì)軟件是不利的。
接下來(lái),我給出我的解決方法,希望對(duì)采用這種界面結(jié)構(gòu)的朋友有所裨益。
(以下全部用簡(jiǎn)化模型來(lái)講述.)
1.簡(jiǎn)單點(diǎn),我們假設(shè)BaseView繼承JWindow,當(dāng)然可以是別的容器(依據(jù)你的實(shí)現(xiàn)),大概象這樣:
public abstract class BaseView extends JWindow{
...
(實(shí)現(xiàn)一些取得界面控件,和界面信息的方法).
}
2.每個(gè)界面類(lèi)都象這樣定義:
public class MyView extends BaseView{
JPanel myPanel;
public void playoutPanel(){
JButton myButton = new JButton("OK");
myPanel.add(myButton);
......
(添加你需要的控件和布局到myPanel上)
}
}
3.假設(shè)有其他的界面OneView,TwoView,ThreeView處理完操作后都需要跳轉(zhuǎn)到myView,在myView中的ok按鈕按下的時(shí)候需要回到原始界面。
原來(lái)臃腫的代碼需要在myView中添加一個(gè)變量BaseView anyView;用來(lái)存放轉(zhuǎn)來(lái)的那個(gè)界面anyView,賦值在三者中的跳轉(zhuǎn)代碼中引用myView來(lái)設(shè)定.跳轉(zhuǎn)代碼象這樣:
public void jump(){
MyView myView = new MyView();
myView.anyView = this;
this.remove(this.xxPanel);
this.add(myView.getPanel());
this.repaint();
}
看起來(lái)還不錯(cuò),雖然需要引用MyView類(lèi),并調(diào)用他的變量和方法.但是跳轉(zhuǎn)回來(lái)卻不那么容易,否則怎么會(huì)用600行!
大概象這樣:(這已經(jīng)是被我簡(jiǎn)化的)
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){
....
}
...
}
不經(jīng)大量應(yīng)用別的業(yè)務(wù)用例界面,這種編譯依賴(lài)性真不是什么好事,更何況用了大量的低效的instanceof判斷和轉(zhuǎn)型操作.
描述為:
一個(gè)界面就是一個(gè)BaseView,他只包含一個(gè)JPanel,這個(gè)包含JPanel包含所有我們的Swing控件,例如JButton,JLable等等。
問(wèn)題出現(xiàn)了:我們通常因?yàn)闃I(yè)務(wù)的需要完成一個(gè)界面的操作要自動(dòng)跳轉(zhuǎn)到下一個(gè)界面,完成下一個(gè)界面又能跳回來(lái)(題外話(huà):由于我們的操作是基于GUI的,所以往往能保存Session信息,而Web卻做不到),而這往往成為系統(tǒng)實(shí)現(xiàn)過(guò)程中效率低下的一個(gè)因素,我就見(jiàn)到我現(xiàn)在的系統(tǒng)中有人用600行代碼判斷上一個(gè)界面應(yīng)該是哪一個(gè)來(lái)跳轉(zhuǎn)過(guò)來(lái),因?yàn)楹芏嘟缑娑伎梢蕴疆?dāng)前界面。
當(dāng)然有一種做法是,在下一個(gè)界面類(lèi)中包含指向上一個(gè)界面的變量,我們說(shuō),這不方便,也增加了依賴(lài)性,這對(duì)軟件是不利的。
接下來(lái),我給出我的解決方法,希望對(duì)采用這種界面結(jié)構(gòu)的朋友有所裨益。
(以下全部用簡(jiǎn)化模型來(lái)講述.)
1.簡(jiǎn)單點(diǎn),我們假設(shè)BaseView繼承JWindow,當(dāng)然可以是別的容器(依據(jù)你的實(shí)現(xiàn)),大概象這樣:
public abstract class BaseView extends JWindow{
...
(實(shí)現(xiàn)一些取得界面控件,和界面信息的方法).
}
2.每個(gè)界面類(lèi)都象這樣定義:
public class MyView extends BaseView{
JPanel myPanel;
public void playoutPanel(){
JButton myButton = new JButton("OK");
myPanel.add(myButton);
......
(添加你需要的控件和布局到myPanel上)
}
}
3.假設(shè)有其他的界面OneView,TwoView,ThreeView處理完操作后都需要跳轉(zhuǎn)到myView,在myView中的ok按鈕按下的時(shí)候需要回到原始界面。
原來(lái)臃腫的代碼需要在myView中添加一個(gè)變量BaseView anyView;用來(lái)存放轉(zhuǎn)來(lái)的那個(gè)界面anyView,賦值在三者中的跳轉(zhuǎn)代碼中引用myView來(lái)設(shè)定.跳轉(zhuǎn)代碼象這樣:
public void jump(){
MyView myView = new MyView();
myView.anyView = this;
this.remove(this.xxPanel);
this.add(myView.getPanel());
this.repaint();
}
看起來(lái)還不錯(cuò),雖然需要引用MyView類(lèi),并調(diào)用他的變量和方法.但是跳轉(zhuǎn)回來(lái)卻不那么容易,否則怎么會(huì)用600行!
大概象這樣:(這已經(jīng)是被我簡(jiǎn)化的)
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){
....
}
...
}
不經(jīng)大量應(yīng)用別的業(yè)務(wù)用例界面,這種編譯依賴(lài)性真不是什么好事,更何況用了大量的低效的instanceof判斷和轉(zhuǎn)型操作.

