MartinFowler的POEAA中介绍了DTO模式http://martinfowler.com/eaaCatalog/dataTransferObject.html,该模式是为了缓解远程分布式系和面向对象之间的矛盾。
面向对象强调的是细粒度的接口,这样保证对象的高灵活度
远程传输则强调性能,尽可能少地频繁交互,这就要求每次交互传输大量数据,这样远程传输和面向对象就产生了不匹配
面对这样的结果,MF提出DTO,将每次传输的数据封装在一个统一的对象中,这个对象虽然和领域模型不匹配,但是已经相对好地实现了封装。
MF还强调DTO并不仅仅用在远程分布式系统中,仍然可有存在本地DTOhttp://martinfowler.com/bliki/LocalDTO.html,这种DTO尤其出现在表现层和领域层不匹配的时候,比如页面上需要显示学生的导师和最近借的十本书,那么导师和借书信息可以封装在一个统一的DTO而避免向表现层传输很多领域对象,并且每个对象只使用少数几个信息。
很多人管DTO也叫VO,这并不等价,DTO强调的是数据传输的方便,而VO则是一组有相同异议数据的封装,二者本质其别在于VO一定有业务含义,DTO不一定有,比如封装了导师和借书信息的DTO肯定不能是VO。