??? 作者:
Flyingis
??? 在Web應用和J2EE框架中經常可以碰到各種Object相關的名詞,在網上搜索了一下,討論各種Object術語的帖子一大筐,大的討論整個框架,小的描述各個層次之間的細微差別,甚至有鉆牛角尖之嫌。
BlogJava
上也有討論VO和PO的貼子,例如
非飛
的
《各層共享使用PO的代價》
等。其實無論怎么討論,這些術語、分層結構、應用框架無非都是為我們的應用而服務的,因此,我們需要的是理解這些術語提出的意義,是理解我們的項目需求,是理解我們采用的框架結構能否最大限度的滿足項目的需要。
??? 在剛剛學習MVC/Model2之前,我是不了解VO/TO/PO/DTO/BO等等這些術語的含義的,至少理解上只是停留在淺層面,現在多看了一些,做了一點項目,多了些想法,但肯定還是存在理解上的偏差或誤解,歡迎大家討論指出!
??? VO: 通常指ValueObject或ViewObject。ViewObject指的是UI需要的對象,Struts的FormBean就是其中的一種,它是Value Object和Transfer Object的總稱。
??? TO: Transfer Object,它和Value Object的區別可以參考Patterns of Enterprise Application Architecture。
??? PO: Persistent Object,即可以被持久化的實體對象。
???
POJO
: Plain Ordinary Java Object。
??? DTO: Data Transfer Object,J2EE 中常用的一種設計模式,現在一般可以將使用Value Object的模式稱為DTO模式,在
Jdon
上一篇《ValueObject和DTO模式的一些疑問》
闡述了兩者的關系。
??? BO: Business Object,可以分為三種情況,只包含業務對象的屬性,或只包含業務方法,或兩者都包含。對于BO的詳細討論,可以
參見這里
。
??? 這些概念經常交錯在一起提出,給初學者造成了一些理解上的困難,其實只需要理順下面幾點,基本上就能弄清楚層次之前的前后關系和如何合理使用這些對象。
??? 1.?VO能否和PO相同。首先回答是肯定的,VO是概念模型的一種抽象反映,當一個業務實體可以用一個物理實體表示的時候,VO和PO屬性相同,那么它們是相等的。例如學生成績管理系統中,成績表單業務實體中包含學生信息、課程信息、成績等,此時它已經不能用一個物理實體所能描述,而其中的學生信息,其VO和PO在屬性上是一樣的,此時的VO和PO相同。
??? 2.?PO能否代替VO。僅僅從功能實現上來說,當VO和PO相同的時候,PO可以代替VO,這樣可以減少一些代碼量,但需要注意的是,這樣會帶來一些問題:當一個業務實體需要多個物理實體來表達的時候,在客戶端顯示一個業務實體就會多次訪問數據庫,即進行多次單表訪問,非視圖;當一個業務實體屬性遠少于一個物理實體的時候,可能會因裝載過多不必要的數據而影響網絡傳輸;對物理實體進行改動的時候會直接影響到表現層。簡單的說,這樣做增加了代碼的耦合性,也增加了代碼維護的難度,項目的可擴展性也大大降低,如果僅僅是為了減少代碼量而付出這些代將顯然是不值的,當然極為簡單的應用可以考慮,一切從項目實際出發。
??? 3.?VO包含的屬性可以多于PO、少于PO、或等于PO中的屬性。
??? 4.?一個基于Struts應用的簡單數據提交流程(VO和PO單獨存在):HTML 頁面中包含了基本的信息,例如文本框、下拉框、單選等,構建一個ActionForm Bean與之一一對應,它是Web層數據的表示,當Web頁面的操作流程發生改變的時候,需要對它進行修改,但不能將修改傳遞到業務層和持久層。然后Action讀取ActionForm Bean的屬性,構造PO對象,調用BO ,當BO收到這個PO之后,調用DAO接口方法,對PO進行持久化操作,完成數據的提交。這里,PO在業務層和持久層之間,沒有被傳遞到Web層的View中去。
??? 5.?一個基于Struts應用的簡單數據查詢流程(VO和PO單獨存在):Action讀取ActionForm Bean中的查詢屬性信息,然后調用BO,BO獲取ActionForm Bean之后調用DAO接口進行查詢,返回所要查詢的PO對象,交給Action,Action通過該PO構建 ActionForm Bean,通過request.setAttribute()或session.setAttribute(),重定向到查詢結果頁面輸出需要的信息。
??? 6.?表現層中的字段一般定義為String或boolean類型,因此VO中的屬性在傳到Action并構建PO對象時需要進行數據類型的轉換,或由ActionForm的helper方法來進行轉換。
??? 參考文章和貼子:
???
http://www.jdon.com/jive/article.jsp?forum=91&thread=23672
???
http://www.jdon.com/jive/article.jsp?forum=91&thread=21571
???
http://www.hibernate.org.cn/viewtopic.php?t=627&postdays=0&postorder=asc&start=0
???
http://bbs.hidotnet.com/704/ShowPost.aspx
???
http://lifework.cnblogs.com/archive/2005/09/03/229596.html
???
http://www.microsoft.com/china/MSDN/library/architecture/patterns/esp/DesDTO.mspx
?