更適合Swing程序的MVC方案
MVC有MVC1和MVC2的區(qū)別,它們的區(qū)別在于MVC1中用Model來通知View進行改變,而MVC2中使用Controller來通知View.在桌面程序中一般采用MVC1,而Web程序多采用MVC2,這是因為web程序中,Model無法知道View的原因.在Swing程序中,我們通常采用讓View實現(xiàn)Observer接口,讓Model繼承Observable類來實現(xiàn)MVC1,而讓Controller把它們創(chuàng)建及連接起來,具體代碼如下:


















而Model進過處理后得到了結果,它采用Observable的notifyObservers()方法來通知View進行改變,而View的public void update(Observable o, Object arg)方法將相應這一改變,它通過解析Observable類型的對象o得到處理結果,再進行具體的表現(xiàn)層改變.
粗看起來MVC各司其職,很完美,但還有不和諧的隱患:
1.View必須知道解析Model,造成了二者的耦合.
2.View非得實現(xiàn)Observer接口,Model非得繼承Observable類,這個處理不是必要的.
3.這種模式只適合即時處理,即相應很快的處理,對于耗時過程并不適合.
4.由于Model中數(shù)據(jù)眾多,很多時候我們還需要建立一個常量類來區(qū)分各種情況和決定View更新的地方,進一步加重了類之間的耦合程度.
綜上,我覺得對于稍大的Swing程序,MVC2+線程回調方式更適合,它的主要處理是:
1.依然由Controller創(chuàng)建View和Model,它們擔負的職責也和原來一樣,但是View不實現(xiàn)Observer接口,Model不繼承Observable類,它們該怎么樣還是怎么樣,而讓Controller來充當它們之間的中介者.
2.如果是即時處理,可以在Controller中添加事件處理時就直接寫來.如果是耗時處理,可以將View和Model的引用(或Model中元素的引用)傳遞給一個線程處理類,具體的運算和界面反應在線程處理類中完成.
下面是一個調用例子:
new FetchTablesThread(model.getDataSource(), view,schema).start();
下面是線程類的例子:



































































這樣做有兩個好處一是使程序結構松散化,適于修改,二是相對傳統(tǒng)的MVC2,Controller中事件處理的代碼也容易變得簡單而清晰,可維護性更佳.
綜上,我認為MVC2+線程回調方式是一種值得推薦的Swing桌面程序寫法.
關于線程回調方式,您可以參考:
http://www.aygfsteel.com/sitinspring/archive/2007/06/28/126809.html
關于MVC,您可以參考:
http://junglesong.yculblog.com/post.2665424.html
posted on 2007-07-19 14:47 sitinspring 閱讀(2315) 評論(5) 編輯 收藏 所屬分類: Object Orient Programming