下面我們談談Application的狀態,在這個范圍內,一個對象狀態可以被多個用戶反復訪問,在這個級別,狀態類似數據庫中數據,因為可以使用數據庫來替代這個級別的狀態,所以將狀態放入緩存這個深層次技術被大多數初學者忽視了,甚至產生了對數據庫依賴心理。
緩存中的狀態
雖然我們將狀態保存在Application中,但是我們不可避免還是遇到Session同樣的狀態管理問題,這個問題所幸的是有專門緩存中間件解決了,當然,在一個多服務器集群系統,如果一個客戶端在一個服務器中存放了狀態,那么能否在另外一個服務器的內存中訪問到呢?回答是肯定的,前提是你必須使用 分布式緩存系統。
目前分布式緩存系統是靠EJB服務器完成,當JBoss 5在2006變成完全解耦、可肢解時,我們就可以使用原本只支持EJB的JBoss分布式緩存系統來支持我們的普通 JavaBeans了(POJO)。這其中目前可能會花費一些力氣,因為還沒有一個統一的POJO構件接口 標準,我相信以后可能會有。
如果你不想花費力氣,而且可能就只是一臺服務器,可以通過雙核芯片提升性能,那么單態緩存如果實現?很簡單,使用一個緩存產品如OsCache等,將其設定保存在 Application中,或者在 web.xml中進行一下簡單的配置即可。
但是,這時你可能碰到另外一個問題:狀態的唯一標識,如何通過唯一標識從緩存中那么多對象狀態中取出你要的那一個呢?比較瑣碎。
有沒有一個框架幫助你省卻這些麻煩,當然推薦Jdon Framework,只要將包含狀態的類(主要是Domain Model)繼承特定的類或接口(接口在1.4版本實現)即可,這個類的對象運行時就會被緩存或從緩存中讀取,再也無需你照料緩存了,就這么簡單。
當然,Jdon Framework的底層緩存器是可以被替代,使用你喜歡的緩存產品,因為jdon Framework是基于Ioc設計,構件之間是完全解耦、可徹底肢解,能夠通過配置替代和更換的。如果你不明白這個道理,需要好好研究一下Ioc模式帶給我們革命性的新變化。
從以上也可以看出:java復雜性還在于我們需要在編碼時,卻要想象其運行時的情形。而這種翻譯聯想沒有深厚的實踐功底,是很難順利完成的。
狀態管理中間件
自從 J2EE開辟中間件時代以來,就有相當多的高級中間件提供與具體應用無關的通用功能,狀態管理中間件很早就有之,EJB的有態Session Bean是一個代表。
一個中間件不但要有良好的松耦合設計,我們暫時稱為靜態設計;更要有優秀的動態設計,例如狀態管理就屬于一種動態設計。
當然,如果你比較謙虛,不但要選擇一些靜態設計很好的框架或中間件;而且還要依賴一些擁有良好的動態運行管理的中間件。
EJB無論是EJB1.X/EJB2.X/EJB3.X.在狀態管理上要更加優秀,當然EJB3.X又吸收了優秀的靜態設計概念,但是因為需要有一個具體服務器實現過程,這個過程中存在一些陷阱,如In-Box問題等。
Spring無疑是一個靜態設計非常優秀框架,它一直在AOP上孜孜不倦,力圖探索一條從AOP角度進行動態運行管理干預捷徑,相信會有驚人結果,當然,這種細粒度的AOP需要實踐檢驗,當然如果整入JDK 6.0就更好。
而Jdon Framework則試圖在目前兩者之間尋求了一個平衡,既有Ioc/AOP優秀的靜態設計,雖然在AOP上不及Spring前衛;但提供了切實Session和Cache狀態管理;
如果你不需要EJB的分布式多服務器集群功能;又不是AOP的超級粉絲,無疑使用Jdon Framework之類的框架無疑是簡化方便的。
狀態設計的難點
最后,我不得不重申,并不是有了良好的狀態管理框架就可以高枕無憂了,狀態的設計其實是我們每個項目必須面臨的可變課題,如果狀態復雜了可以使用狀態模式對付,可惜往往狀態不夠復雜。
一個對象本身屬性和狀態是應該耦合在一起,還是進行分離,屬性和狀態沒有明顯的涇渭分明的界限,我們舉一個例子:
論壇Forum這個對象,它有一些字段屬性,如論壇名稱、論壇描述,還有其他一些相關屬性:如該論壇的最新發帖;該論壇的發貼量,后兩者好像也是論壇字段,但是他們可能經常變化的,應該屬于狀態,那么狀態和Forum這個主體對象是什么關系?是將該論壇的最新發帖和該論壇的發貼量兩個字段并入Forum這個Domain Model中,還是應該單獨建立一個狀態對象?如果進行分離,分離的依據是什么?
當然,這里分離的依據是因為對象的生存周期不同。對于我們熟悉的課題,我們能夠馬上分辨出其中的生存周期,如果是不熟悉領域的建模呢?
所以,大家已經明白:狀態設計的難點是:如何粒度細化地創建模型對象;然后分辨出其中動態的狀態性質。這是域建模實戰中一個難點。
很多人問我:你提倡的域建模、設計模式和框架是什么意思?為什么說他們是Java開發設計的三件寶呢?或者說三個典型知識點呢?我想通過本篇我已經通過狀態這個概念稍微解釋了域建模的一些特點。
當前,MDA中的四色原型模式Archetype將幫助我們更好地分辨出類的屬性、狀態和行為,這是一場帶來以后十年的軟件革命。
原文轉自:http://www.anti-gravitydesign.com