java对象之dto

在分布式系统中,客户端和服务器端交互有两种情形:第一个是客户端从服务器端读取数据;第二个是客户端将本身的数据传递给服务器端。

 

当有客户端要向服务器端传输大量数据的时候,可以通过一个包含要传输的所有数据的方法调用来完成。这在小数据量的时候缺点并不明显,但是如果要传递包含有大量信息的数据的时候,这将变得难以忍受。下面的方法是任何人看了都会害怕的:

int width,BigDecimal weight,BigDecimal price,String description)

这种接口也是非常的脆弱,一旦需要添加或者删除某个属性,方法的签名就要改变。

当客户端要从服务器端取得大量数据的时候,可以使用多个细粒度的对服务器端的调用来获取数据。比如:

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("价格:"+intf.getPrice(id));

System.out.println("描述信息:"+intf.getDescription(id));

这种方式中每一个get***方法都是一个对服务器的远程调用,都需要对参数和返回值进行序列化和反序列化,而且服务器进行这些调用的时候还需要进行事务、权限、日志的处理,这会造成性能的大幅下降。如果没有使用客户端事务的话还会导致这些调用不在一个事务中从而导致数据错误。

系统需要一种在客户端和服务器端之间高效、安全地进行数据传输的技术。DTO(Data Transfer Object,数据传送对象)是解决这个问题的比较好的方式。DTO是一个普通的Java类,它封装了要传送的批量的数据。当客户端需要读取服务器端的数据的时候,服务器端将数据封装在DTO中,这样客户端就可以在一个网络调用中获得它需要的所有数据。

还是上面的例子,服务器端的服务将创建一个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("价格:"+info.getPrice());

System.out.println("描述信息:"+info.getDescription());

使用DTO 的时候,一个主要问题是选择什么样的DTO:这个DTO能够容纳哪些数据,DTO的结构是什么,这个DTO是如何产生的。DTO是服务器端和客户端进行通信的一个协议格式,合理的DTO设计将会使得服务器和客户端的通信更加顺畅。在水平开发模式(即每个开发人员负责系统的不同层,A专门负责Web表现层的开发,B专门负责服务层的开发)中,在项目初期合理的DTO设计会减少各层开发人员之间的纠纷;在垂直开发模式(即每个开发人员负责不同模块的所有层,A 专门负责库存管理模块的开发,B专门负责固定资产模块的开发)中,虽然开发人员可以自由地调整DTO的结构,但是合理的DTO设计仍然会减少返工的可能性。

实现DTO 最简单的方法是将服务端的域对象(比如hibernate中的PO、EJB中的实体Bean)进行拷贝然后作为DTO传递。采用域对象做DTO比较简单和清晰,因为DTO与域模型一致,所以了解一个结构就够了。这样做也免去了DTO的设计,使得开发工作变得更快。这种做法的缺点是域DTO的粒度太大以至于难以满足客户端的细粒度的要求,客户端可能不需要访问那些域中的所有属性,也可能需要不是简单地被封装在域中的数据,当域DTO不能满足要求的时候就需要更加细粒度的DTO方案。目前主流的DTO解决方案有定制DTO、数据传送哈希表、数据传送行集。

posted @ 2017-02-22 14:24  飞教主  阅读(780)  评论(0编辑  收藏  举报