1.VO(View Object):
視圖對象,用于展示層惩猫,它的作用是把某個(gè)指定頁面(或組件)的所有數(shù)據(jù)封裝起來嘁灯。
2.DTO(Data Transfer Object):
數(shù)據(jù)傳輸對象辞友,這個(gè)概念來源于J2EE的設(shè)計(jì)模式师痕,原來的目的是為了EJB的分布式應(yīng)用提供粗粒度的數(shù)據(jù)實(shí)體溃睹,以減少分布式調(diào)用的次數(shù),從而提高分布式調(diào)用的性能和降低網(wǎng)絡(luò)負(fù)載胰坟,但在這里因篇,我泛指用于展示層與服務(wù)層之間的數(shù)據(jù)傳輸對象。
3.DO(Domain Object):
領(lǐng)域?qū)ο蟊屎幔褪菑默F(xiàn)實(shí)世界中抽象出來的有形或無形的業(yè)務(wù)實(shí)體竞滓。
4.PO(Persistent Object):
持久化對象,它跟持久層(通常是關(guān)系型數(shù)據(jù)庫)的數(shù)據(jù)結(jié)構(gòu)形成一一對應(yīng)的映射關(guān)系吹缔,如果持久層是關(guān)系型數(shù)據(jù)庫商佑,那么,數(shù)據(jù)表中的每個(gè)字段(或若干個(gè))就對應(yīng)PO的一個(gè)(或若干個(gè))屬性厢塘。
5.VO與DTO的區(qū)別
大家可能會(huì)有個(gè)疑問:既然DTO是展示層與服務(wù)層之間傳遞數(shù)據(jù)的對象茶没,為什么還需要一個(gè)VO呢?對俗冻!對于絕大部分的應(yīng)用場景來說,DTO和VO的屬性值基本是一致的牍颈,而且他們通常都是POJO迄薄,因此沒必要多此一舉,但不要忘記這是實(shí)現(xiàn)層面的思維煮岁,對于設(shè)計(jì)層面來說讥蔽,概念上還是應(yīng)該存在VO和DTO涣易,因?yàn)閮烧哂兄举|(zhì)的區(qū)別,DTO代表服務(wù)層需要接收的數(shù)據(jù)和返回的數(shù)據(jù)冶伞,而VO代表展示層需要顯示的數(shù)據(jù)新症。
6.DTO與DO的區(qū)別
首先是概念上的區(qū)別,DTO是展示層和服務(wù)層之間的數(shù)據(jù)傳輸對象(可以認(rèn)為是兩者之間的協(xié)議)响禽,而DO是對現(xiàn)實(shí)世界各種業(yè)務(wù)角色的抽象徒爹,這就引出了兩者在數(shù)據(jù)上的區(qū)別,例如UserInfo和User(對于DTO和DO的命名規(guī)則芋类,請參見筆者前面的一篇博文)隆嗅,對于一個(gè)getUser方法來說,本質(zhì)上它永遠(yuǎn)不應(yīng)該返回用戶的密碼侯繁,因此UserInfo至少比User少一個(gè)password的數(shù)據(jù)胖喳。而在領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)中,正如第一篇系列文章所說贮竟,DO不是簡單的POJO丽焊,它具有領(lǐng)域業(yè)務(wù)邏輯。