既然涉及到DTO就先學(xué)習(xí)一下。
原文概述
這里把我能理解的po出來
什么是DTO
本來了解一下什么是DTO模型,應(yīng)為這個(gè)東東在架構(gòu)中存在不小的價(jià)值,找找發(fā)現(xiàn)有個(gè)java版本的,不過也基本一樣,就順便抄過來了,這篇文章講解通俗易懂。
在分布式系統(tǒng)中,客戶端和服務(wù)器端交互有兩種情形:第一個(gè)是客戶端從服務(wù)器端讀取數(shù)據(jù);第二個(gè)是客戶端將本身的數(shù)據(jù)傳遞給服務(wù)器端。
當(dāng)有客戶端要向服務(wù)器端傳輸大量數(shù)據(jù)的時(shí)候,可以通過一個(gè)包含要傳輸?shù)乃袛?shù)據(jù)的方法調(diào)用來完成。這在小數(shù)據(jù)量的時(shí)候缺點(diǎn)并不明顯,但是如果要傳遞包含有大量信息的數(shù)據(jù)的時(shí)候,這將變得難以忍受。下面的方法是任何人看了都會(huì)害怕的:
public void save(String id,String number,String name,int type,int height,
int width,BigDecimal weight,BigDecimal price,String description)
這種接口也是非常的脆弱,一旦需要添加或者刪除某個(gè)屬性,方法的簽名就要改變。
當(dāng)客戶端要從服務(wù)器端取得大量數(shù)據(jù)的時(shí)候,可以使用多個(gè)細(xì)粒度的對服務(wù)器端的調(diào)用來獲取數(shù)據(jù)。比如:
ISomeInterface intf = RemoteService.getSomeInterface();
System.out.println("您要查詢的商品的資料為:");
System.out.println("編號:"+intf.getNumber(id));
System.out.println("姓名:"+intf.getName(id));
System.out.println("類型:"+intf.getType(id));
System.out.println("高度:"+intf.getHeight(id));
System.out.println("寬度:"+intf.getWidth(id));
System.out.println("價(jià)格:"+intf.getPrice(id));
System.out.println("描述信息:"+intf.getDescription(id));
這種方式中每一個(gè)get***方法都是一個(gè)對服務(wù)器的遠(yuǎn)程調(diào)用,都需要對參數(shù)和返回值進(jìn)行序列化和反序列化,而且服務(wù)器進(jìn)行這些調(diào)用的時(shí)候還需要進(jìn)行事務(wù)、權(quán)限、日志的處理,這會(huì)造成性能的大幅下降。如果沒有使用客戶端事務(wù)的話還會(huì)導(dǎo)致這些調(diào)用不在一個(gè)事務(wù)中從而導(dǎo)致數(shù)據(jù)錯(cuò)誤。
系統(tǒng)需要一種在客戶端和服務(wù)器端之間高效、安全地進(jìn)行數(shù)據(jù)傳輸?shù)募夹g(shù)。DTO(Data Transfer Object,數(shù)據(jù)傳送對象)是解決這個(gè)問題的比較好的方式。DTO是一個(gè)普通的Java類,它封裝了要傳送的批量的數(shù)據(jù)。當(dāng)客戶端需要讀取服務(wù)器端的數(shù)據(jù)的時(shí)候,服務(wù)器端將數(shù)據(jù)封裝在DTO中,這樣客戶端就可以在一個(gè)網(wǎng)絡(luò)調(diào)用中獲得它需要的所有數(shù)據(jù)。
還是上面的例子,服務(wù)器端的服務(wù)將創(chuàng)建一個(gè)DTO并封裝客戶端所需要的屬性,然后返回給客戶端:
ISomeInterface intf = RemoteService.getSomeInterface();
SomeDTOInfo info = intf.getSomeData(id);
System.out.println("您要查詢的商品的資料為:");
System.out.println("編號:"+info.getNumber());
System.out.println("姓名:"+info.getName());
System.out.println("類型:"+info.getType());
System.out.println("高度:"+info.getHeight());
System.out.println("寬度:"+info.getWidth());
System.out.println("價(jià)格:"+info.getPrice());
System.out.println("描述信息:"+info.getDescription());