第六种设计模式Transfer Object
概述:这个设计模式其实笔者个人感觉,非常像Business
Delegate。因为那个主要是把请求的传递,利用一个对象的方法来进行,而这个设计模式,是返回业务层的处理结果,把处理的结果作为一个对象返回给调用他的请求者,我们可以通过序列化(Serializable)这个对象,然后就可以通过网络把Transfer Object传递到展示层。这样展示层就不需要调用远程的EJB方法来取得数据,直接在本地可以读取其内容。(一些书籍把这个设计模式叫做Value
Object),SCWCD考试里面用的是Transfer Object.
应用:当你的程序需要调用远程接口查询资源层的数据,并且要展示的时候,建议使用Transfer
Object,可以降低网络的数据流量,有效地解决网络传输数据的瓶颈问题。原本需要返回4个结果的getUserName(), getGender(),
getAge(),getMoney(),就可以通过如下的一个对象,整体返回,然后通过利用这个对象的名字.属性方式读取。
import
java.io.Serializable;
public
class User implements Serializable{
String
userName;
String
gender;
int
age;
double
money;
public
String getUserName(){
return
this.userName;
}
public
String getGender(){
return
this.gender;
}
public
int getAge(){
return
this.age;
}
public
double getMoney(){
return
this.money;
}
//
Setters go here…
}
到这里,也许有的读者会有疑问,那么如果我单一的返回数据:
username = Meng,Qinglin
gender = male
age = 28
money = 100,000.00
还有我返回一个Transfer
Object对象Jimmy,其中
Jimmy.username = Meng,Qinglin
Jimmy.gender = male
Jimmy.age = 28
Jimmy.money = 100,000.00
有什么区别呢?好像并没有减少数据流量啊?
对!对于数据本身来说,的确没有区别,但是,这些数据是你如何获取的呢?别忘了我们是通过互联网来请求数据的,我们要遵守网络底层的通信协议。就是需要这样
1. 客户端跟服务器发出一个请求,我要跟你要东西了,好比我要去你家里拿东西,我要先按门铃。
2. 服务器端返回一个接受你的连接的确认信息。好比屋里的人跟你说,听见了,就来开门。
3. 最后当客户端受到了服务器的回应,才会正式的建立连接。这就好比开了们,你拿到东西了。
第一种方法,你需要跟业务层说,请给我username,然后在请求一次,请给我gender;第三次,请给我age;最后一次,请给我money。估计如果别人要这样砸你家里的大门四次跟你要东西,你能一脚把他踢飞。
如果封装一个对象,你只要请求一次,请求的内容是啊,请把Jimmy这个对象给我吧。你是否乐意与把所有的东西都装进一个大口袋,整个交给他呢?J

优点:可以降低网络数据流量,缩短数据存取的时间。利用jsp或者servlet可以在本地快捷访问。
缺点:有可能不会及时地反映出最新的数据,这是为什么呢?当你把一个经过序列化的Transfer
Object传递给展示层的时候,如果刚好这个时候,数据库里面的东西被改动了。那么你通过JSP或者servlet读取的,将会是Transfer Object里面的内容,而不是最新的数据。如果你通过他修改数据,然后再把数据传递回想更新数据库的时候,有可能出现数据同步的问题。所以我们一般使用这个设计模式用来读取数据,而不是更新数据。
举例:如果你做一个在线购物网站,需要从数据库读取货品,利用Transfer Object会是一个不错的选择。
考试:记住以下的要点,有助于通过考试。
Simplifies Entity Bean and
Remote Interface
Transfers More Data in Fewer
Remote Calls
Reduces Network Traffic
Reduces Code Duplication
May Introduce Stale Transfer
Objects
May Increase Complexity due to
Synchronization and Version Control
Concurrent Access and
Transactions