ValueObject和DTO模式的一些疑問

cats_tiger發表於2005-11-11
ValueObject和DTO模式是常用的J2EE設計模式,模式所體現的不僅僅是一個設計技巧,更主要的是資料封裝的思想。最近我在做設計的時候卻對這個模式產生了一些疑問。
1. 對於位於持久層中的ValueObject,我是否應該限制他們的使用範圍?以Hiberante為例,由於ValueObject的生命週期的特性,我們不能把他們當作DTO在層間傳遞。但是,如果使用BeanUtils等工具複製一個的話,卻總是感覺有些浪費記憶體。如果是EntityBean則沒有這些疑問――很顯然我不能把EJB Bean例項當作DTO在層間傳遞――浪費就浪費吧。
2. 表現層的表單也需要物件封裝,在Struts中就是FormBean,但是在JSF中卻沒有這樣的概念,這樣一不小心我們就容易在表現層直接使用model中的物件,這也是不合理的。
3. Business層需要處理從表現層傳入的資料物件,這個資料物件也不能是FormBean或其他表現層VO,因為往往這些表現層VO直接反映的是表單資料,例如一個String格式的日期或者confirmedPassword,前者需要轉化為Date型別而後者則在Business層用不到,這些處理也應該在表現層處理(?)。
4. DAO層接收Business層的資料,這個資料應是Business層對錶現層資料的處理結果。
這樣一來,我們在處理一個case的時候就出現了3個ValueObject:
 一個是表現層的用於反映頁面資料。
 一個是Business層的,用於作為表現層和Business之間的DTO。
 另一個是Domain&DAO層的,用於持久化的ValueObject。
這真是浪費呀!
我的疑問是,我是否可以省略其中的一個或多個?還是根據不同情況和需求靈活處理,各位大蝦是如何做的?

相關文章