前言:
我打算寫一系列關於Swing程序開發的文章。這是因爲最近我在作一個Swing產品的開發。長期作JavaEE程序,讓我有些麻木了。Swing是設計模式的典範,是一件優雅的藝術品,是一件超越時代的產品!
有機會做Swing軟件的開發,讓我很是有感受!
呵呵,但願有機會可以用Java3D編寫軟件,那種感受必定更棒!
Java和Swing都是傑做。我這我的對別人一貫很挑剔的,可以獲得我由衷地讚譽,可想而知它們有多優秀了。奇怪的是,它們竟然一直都沒法佔領桌面市場。有人說這是技術的緣由。我認爲這應該是商業、歷史的緣由纔對。
好了,我也應該爲java和Swing在桌面的成功盡我綿薄之力,共享個人思想吧!以感謝這麼多年來,Java帶給個人美好回憶。
檯燈、電腦、Java,還有Coffee,伴我度過多少不眠之夜!I love U!
Swing
程序最佳架構設計之一
業務模型中心架構模式
以業務模型爲中心
以業務模型爲中心的架構模式。這是Swing和其餘全部程序應該採用的架構模式。之因此強調Swing,是由於在Swing程序中使用這種「以業務模型爲中心」的架構模式,更有意義,做用更大!
咱們知道,一個軟件由幾個部分組成:
1,表現層(用戶界面層)
這時軟件和用戶交互的部分,能夠分爲字符界面(DOS等命令行),GUI圖形界面(桌面GUI,瀏覽器GUI,三維界面)等。
這僅僅是軟件的外表,外貌再華麗,也不能說明軟件的優劣!Google的界面平淡無奇,但它確是今天最強大的軟件!
2,業務層
這是實現軟件功能的地方。存在着大量映射着業務領域的對象,存在着複雜的業務計算。這纔是軟件真正工做的地方。
軟件的核心和難點就在這裏!巨大的開發工做量和思考,也都集中在這裏。
業務模型,及其互相之間的交互,這纔是軟件的核心!
3,數據庫訪問層(可能有)
有些軟件須要把操做保存進數據庫,永久保留下來。一般,企業級等須要業務數據的軟件須要這個模塊。
它實現業務對象和關係型數據庫的映射。稱爲「O-R」映射。
4,持久化層(可能有)
有些軟件不把數據保存進數據庫,而是保存爲文件。如,二進制文件,文本文件,XML文件等。
它實現業務對象和文件之間的映射。多是序列化業務對象。若是是保存爲xml文件,咱們稱它爲O-XML映射,是業務對象和XML文件之間的映射。
如今有一些開源軟件實現了Java對象和XML文件之間的映射,就如同是O-R映射同樣。其實,基於Java的XML訪問組件,本身開發O-XML映射也是很是簡單的,我本身也寫了一個這樣的庫。
能夠看到,「以業務模型爲中心」,並非一種特例,而是最基本的軟件開發規律!是全部軟件共有的基本特性。只是,今天,在各自不一樣的領域,這個基本常識被一些經常使用的領域中的架構模式所模糊了。
如,在Java的企業級軟件開發中,你們都知道J2EE軟件分爲3層:
1,表現層
2,業務層-----業務對象和Service助手類
3,數據庫訪問層-----DAO助手類
這樣的架構模式,模糊了「業務對象」是整個軟件的核心這樣一個事實。
Service助手類和DAO助手類,實際上都是業務對象的一部分,徹底能夠被放在業務類中。
助手類和業務對象分離,不過是一種設計模式而已。
Swing程序中的應用
好了,本文並不想討論這些「形而上學」的問題。上面的討論,不過是想讓你明白,本文所論述的「以業務模型爲中心」的架構模式,並非Swing應用程序所特有的,而是全部軟件的特性,只是,在Swing這個條件優越的桌面開發環境中,更加有用罷了!
Swing程序做爲桌面程序,擁有比JavaEE程序更好的環境,更強的功能。
Swing程序經常是單機的,即便是網絡化的,也能夠在業務層中實現分佈式,而不像JavaEE程序,用戶界面和響應用戶操做的代碼都是分佈在不一樣的機器上的!
所以,Swing程序更能發揮咱們軟件開發者的智慧和能力!
Swing
程序最佳架構設計之二
MVC
模式
Swing程序的組成
通常,Swing程序由如下幾部分組成:
1,表現層----Swing組件組成的GUI
2,業務層------業務對象,及其相互之間的關係
3,持久化層-----把業務對象保存爲文件,或者是數據庫記錄。
MVC模式在Swing程序中的應用
咱們知道,Swing是MVC模式的典範。Swing的各個可視化組件都使用MVC模式來設計。
Swing組件通常由三個部分組成:
1,Swing的Model,這是MVC中的M—模型部分。它保存了Swing組件所須要的數據。Swing組件的UI須要根據它來展示。
2,Swing的UI類。這是MVC模式的View—視圖部分。它根據組件的Model中的數據,執行繪製、展示Swing組件的任務。
3,Swing組件類。這是「門面」,它封裝了Swing的UI對象和Model對象。咱們通常都是經過它來操縱Swing組件,不會直接使用Swing組件內部的UI對象和Model對象。
Swing組件之間,還有着複雜的關係。Swing的UI類,監聽Model對象的數據改變,即時進行重繪界面的工做。
在Swing組件上還能夠註冊一系列的事件監聽器。它們就是MVC模式中的Controller控制器。
Swing應用程序中使用MVC模式
一個Swing應用程序的GUI由不少個Swing組件組成。各個Swing組件自己是由MVC模式設計的,而咱們的整個Swing應用程序的表現層也應該由MVC模式設計。
使用MVC模式,可以更好地分離代碼和數據。使整個應用的表現層部分,更加低耦合、高內聚,靈活度更高。
在Swing應用程序的編寫過程當中,咱們須要使用Swing組件的2個部分:
1,Swing組件的Model。Swing組件的MVC模式設計,使整個Swing組件是以Model爲核心的。經過更改Model,咱們就可以即時改變Swing組件的UI外觀。
2,Swing組件上註冊事件監聽器。這是Swing組件的控制器,也能夠做爲整個Swing程序的控制器之一。
在Swing組件的監聽器中,咱們能夠響應用戶的操做,做爲整個程序功能的入口。在這裏,咱們能夠調用業務層的代碼進行業務計算。計算完畢以後,能夠修改Swing程序的外觀。經常是修改某個Swing組件的Model。
Swing組件的監聽器,通常是使用Swing程序的內部類來實現的。所以,咱們能夠在控制器中徹底使用整個Swing程序的全部資源!所以,Swing組件的控制器是足夠足夠強大的!
此Model非彼Model
讀者應該對JavaEE比較熟悉吧。畢竟,今天Java的主戰場是在企業級應用上,會java,而不懂javaEE,這就有點說不過去了。
這裏,我以你們比較熟悉的JavaEE的表現層技術來講明Swing程序的MVC設計。
Struts中,其MVC由如下幾部分組成:
1,View視圖,就是使用Struts標籤的JSP頁面。
2,Controller控制器,就是響應用戶操做的Action。
3,Model模型,就是用戶html頁面表單中提交的數據。這在Struts中被稱爲「form」表單。
HTML表單的數據,都是String型的,而咱們的業務對象的屬性,卻未必都是String型的。所以,在Struts應用程序中,咱們須要根據接收到的form對象,構造業務對象。
在SpringMVC中,提供了一個機制,能夠幫助咱們自動把表單數據轉爲業務對象。對於一些特殊的類型轉換,仍是須要咱們手工提供轉換。
Form和業務對象之間的自動轉換,當然是提升了開發效率。可是,咱們必需要明白,GUI組件中的數據Form和業務對象是大相徑庭的兩種東西。2者碰巧同樣,或者能夠自動轉換,只是特例。它們本質上仍是兩樣大相徑庭的東西。
Form是表現層的數據容器,而業務對象則是來自於特定業務的對象。Form的數據類型,變化很少,而業務對象的數據類型,那就是變幻無窮了。
所以,Form對象類型和業務對象類型一致,這是少之又少的特例。
Swing程序中的表單數據(Form)和業務對象(Model)
Web應用程序中的表單數據form,是來自於Html的表單的各個項的數據,都是String類型。
Swing程序中的表單數據Form。是由Swing程序的各個Swing組件的Model組成的。其各個部分的數據類型很是不一樣。
如,最簡單的文本框JTextField的Model,是
javax.swing.text.Document類型的對象。這個對象,咱們也能夠直接獲得或設置String的值來做爲Model。實際上這個String類型的數據,是Document的屬性。
還有,如JTree組件的Model是TreeModel對象。
所以,Swing程序中的表單數據Form的類型是很是多的。顯然,咱們的業務對象不大可能和Swing的Form數據的類型一致。
所以,Swing程序的表現層的數據Form和業務對象Model之間的轉換,必然要由咱們本身去實現。不大可能直接把Form做爲業務對象扔到業務層中使用。也不可能直接在Swing的GUI中顯示業務對象的數據!
Swing程序的MVC模式的使用
整個Swing程序應該這樣使用MVC模式:
1,JFrame或者其餘頂層容器中,由各個Swing組件構成了View視圖層。用來展示數據,提供用戶操做的圖形界面。
2,一個或者一組業務對象是Model。它們存放了Swing組件要顯示的數據。它們是業務對象,所以,能夠直接在業務層代碼中使用,執行復雜的業務計算。
它們不能直接在Swing組件中顯示。而是須要根據業務對象,構造Form對象,也就是Swing組件的Model來展現數據。
爲了讓View—Swing組件實時展示業務對象的數據,咱們須要讓Swing組件監聽業務對象,一旦業務對象發生改變,就從新根據新的數據,構建新的Swing組件的Model,從而在Swing組件上展示最新的業務對象數據。
這裏,咱們使用
ChangeListener改變監聽器。
爲了讓業務對象可以獲得用戶最新輸入的數據,咱們還須要將業務對象註冊到Swing組件上。一旦Swing組件的數據發生了改變,就通知業務對象。業務對象根據Swing組件的Model,也就是Form對象的數據,修改業務對象的值。
爲了實現這樣的功能,我也使用了事件機制,實現了這一功能。這將在下文中論述。
如今,業務對象和Swing組件之間,經過雙向的事件監聽機制,實現了雙向的引用!
3,在Swing各個組件上註冊響應事件的監聽器(控制器),以響應用戶的操做。這些控制器,使用匿名內部類實現。
每個Swing組件上的控制器,都不只僅是該Swing組件的控制器,而是整個Swing程序的控制器。由於,內部類能夠操縱整個Swing程序的全部資源,所以,咱們能夠在控制器中,使用全部Swing組件的form,也可使用全部業務對象,調用全部業務方法,實現任何須要的功能!
控制器,是業務功能的入口點,它鏈接了Swing程序的表現層和業務層,鏈接了Swing的Form(Swing組件的Model)和業務對象。
如今,咱們的Swing程序結構清晰,功能區分合理,低耦合、高內聚,堪稱是MVC模式的典範!
Swing組件和業務對象之間的互動關係
在上文中,咱們提出了Swing組件和業務對象之間相互的事件監聽機制。Swing組件監聽業務對象,使用「觀察者模式」的一種實現機制,ChangeListener改變監聽器。固然,也可使用Observe/Observable這樣的機制,或者其它的事件機制。可是,通過權衡,我以爲仍是ChangeListener最符合個人須要。它功能強大,又很簡單。
當咱們須要某個Swing組件監聽咱們的業務對象時,咱們建立一個該Swing組件的子類,它實現ChangeListener接口,實現
public void stateChanged(ChangeEvent e){…}方法,根據監聽的業務對象的數據,構建本身新的Model,從而改變本Swing組件的顯示。
業務對象又該怎樣監聽Swing組件呢?
我鍾愛ChangeListener,仍是在Swing組件上註冊一個ChangeListener監聽器,這個監聽器就是咱們的業務對象。
可是,考慮到ChangeListener使用場合甚廣,爲了不Swing組件的其餘操做激發該事件,我參照ChangeListener接口,新建了一個類型的新接口:ControllerChangeListener接口。
如今,Swing組件上的數據就可以和咱們的業務對象的數據保持同步了!Form和業務對象雖然類型不一樣,卻好像是同一個對象,有着一樣的數據!
採用MVC模式後的Swing程序的執行流程
1,用戶能夠看到一個Swing組件構成的GUI界面。
2,用戶在界面上進行操做。
3,Swing組件的控制器被觸發。
1)可能會激發ControllerChangeListener的事件,引發業務對象自動使用Swing組件的Model數據進行更新。
2)業務對象更新數據,又會激發業務對象上的ChangeListener的事件。這會引發全部監聽業務對象其Swing組件更新其Model的數據,從而改變Swing組件的顯示。
3)咱們可能會針對業務對象,執行業務層代碼,進行復雜的業務計算。獲得新的業務對象的值。
這一樣會激發業務對象的ChangeListener事件,讓Swing組件的Model獲得更新,從而改變Swing組件顯示的界面。
4)最後,固然,咱們也能夠直接修改某些Swing組件的Model或者外觀。由於,做爲內部類的控制器可使用Swing程序全部的屬性和方法。
因此,在這裏的控制器中,咱們應該使用SwingWorker這個助手類,把業務代碼放在
public
Object construct() {…}方法中執行,
而把直接修改Swing組件UI的方法,放到public void finished() {…}方法中執行。這樣,Swing程序的交互性、響應能力和性能將大大提升!
能夠看到,這裏,經過將業務對象和Form對象(Swing組件的Model)關聯起來,咱們在Swing應用程序中只須要「以業務對象爲中心」。操縱業務對象,執行業務操做便可。
Swing程序的用戶界面,就會自動更新。
這就是採用「以業務對象爲中心的MVC模式」的巨大優點!
http://www.cnblogs.com/armlinux/archive/2007/02/05/2391035.html