![]()
POJO
簡單的JAVA對象(Plain ordinary Java Objects)實際就是普通JavaBeans,使用POJO名稱是為了避免和EJB混淆起來, 而且簡稱比較直接。
其中有一些屬性及其getter setter方法的類,有時可以作為value object或dto(Data Transform Object)來使用。
當(dāng)然,如果你有一個簡單的運算屬性也是可以的,但不允許有業(yè)務(wù)方法,也不能攜帶有connection之類的方法。
PO
PO(persistant object) 持久對象,可以看成是與數(shù)據(jù)庫中的表相映射的java對象。一張表對映一個PO。
最簡單的PO就是對應(yīng)數(shù)據(jù)庫中某個表中的一條記錄,多個記錄可以用PO的集合。PO中應(yīng)該不包含任何對數(shù)據(jù)庫的操作。
DAO
DAO (data access object) 數(shù)據(jù)訪問對象,此對象用于訪問數(shù)據(jù)庫。
通常和PO結(jié)合使用,DAO中包含了各種數(shù)據(jù)庫的操作方法。通過它的方法,結(jié)合PO對數(shù)據(jù)庫進(jìn)行相關(guān)的操作。
DTO
DTO (Data Transfer Object)
數(shù)據(jù)傳輸對象,主要用于遠(yuǎn)程調(diào)用等需要大量傳輸對象的地方。比如我們一張表有100個字段,那么對應(yīng)的PO就有100個屬性,但是我們界面上只要顯示10個字段,客戶端用WEB service來獲取數(shù)據(jù),沒有必要把整個PO對象傳遞到客戶端,這時我們就可以用只有這10個屬性的DTO來傳遞結(jié)果到客戶端,這樣也不會暴露服務(wù)端表結(jié)構(gòu)。到達(dá)客戶端以后,如果用這個對象來對應(yīng)界面顯示,那此時它的身份就轉(zhuǎn)為VO。
VO
VO(value object) 值對象,通常用于業(yè)務(wù)層之間的數(shù)據(jù)傳遞,和PO一樣也是僅僅包含數(shù)據(jù)而已。
但應(yīng)是抽象出的業(yè)務(wù)對象,可以和表對應(yīng),也可以不,這根據(jù)業(yè)務(wù)的需要。個人覺得同DTO(數(shù)據(jù)傳輸對象),在web上傳遞。
BO
BO:全稱是business object:業(yè)務(wù)對象,主要作用是把業(yè)務(wù)邏輯封裝為一個對象。這個對象可以包括一個或多個其它的對象。
比如一個簡歷,有教育經(jīng)歷、工作經(jīng)歷、社會關(guān)系等等。我們可以把教育經(jīng)歷對應(yīng)一個PO,工作經(jīng)歷對應(yīng)一個PO,社會關(guān)系對應(yīng)一個PO。
建立一個對應(yīng)簡歷的BO對象處理簡歷,每個BO包含這些PO。這樣處理業(yè)務(wù)邏輯時,我們就可以針對BO去處理。
biz
biz是Business的縮寫,是業(yè)務(wù)邏輯層,一般意義上和service層差不多。項目前期或者小項目沒什么太大區(qū)別,但是項目大了以后區(qū)別就很大了。
項目開發(fā)到后期的話,一個項目內(nèi)包含有其他的小項目,比如:后臺、erp、商城等等,都用的是同一個數(shù)據(jù)庫。這個時候,就不能使用一個service/biz 全部解決了。有些業(yè)務(wù)是通用的,有一些業(yè)務(wù)可能只有erp有,其他模塊沒有,也有可能同一個業(yè)務(wù),在細(xì)微上有一些差別,如果全部都放進(jìn)一個業(yè)務(wù)層中的話,這個業(yè)務(wù)層就會非常的臃腫。這個時候就需要拆分,一個基礎(chǔ)業(yè)務(wù)層,一個應(yīng)用層業(yè)務(wù)層,基礎(chǔ)業(yè)務(wù)層只是針對該對象的CURD操作
應(yīng)用業(yè)務(wù)層就是一個復(fù)雜的功能模塊或流程。
這時可以考慮service作基礎(chǔ)業(yè)務(wù)層,biz作為應(yīng)用層業(yè)務(wù)層。service是比較底層的api,biz是應(yīng)用層的api。可以結(jié)合DDD領(lǐng)域驅(qū)動設(shè)計理解。
充血模型與貧血模型
貧血模型最早廣泛應(yīng)用是源自于EJB2,最強(qiáng)盛時期則是由Spring創(chuàng)造,把“行為”(也稱為邏輯、過程)和“狀態(tài)”(可理解為數(shù)據(jù),對應(yīng)到語言就是對象成員變量)分離到不同的對象之中,那個只有狀態(tài)的對象就是所謂的“貧血對象”(常稱為VO——Value Object),而那個只有行為的對象就是我們常見的N層結(jié)構(gòu)中的Logic/Service/Manager層(對應(yīng)到EJB2中的Stateless Session Bean)。
充血模型其實很簡單,就是面向?qū)ο笤O(shè)計的本質(zhì):“一個對象是擁有狀態(tài)和行為的”,比如說一個人,他眼睛什么樣鼻子什么樣這就是狀態(tài),人可以去打游戲或是寫程序,這就是行為。
總結(jié)
貧血模型, 將數(shù)據(jù)與db操作分離, 分個好幾層, 如entity/dao/service等。
充血模型, 數(shù)據(jù)與db操作綁在一次, 一般只涉及到一兩層。
充血模型層數(shù)少,代碼少, 改動少, 簡單, 優(yōu)雅,一般復(fù)雜的系統(tǒng)可以考慮用充血模型,簡單系統(tǒng)用貧血模型也并沒有什么影響。
如若轉(zhuǎn)載,請注明出處:開源字節(jié) https://sourcebyte.cn/article/229.html






