随着现在后端编程标准化程度越来越高,各种编程模型层出不穷。作为Java开发人员,大部分人不免要接触VO,BO,PO,DO,DTO之类的,但很多人对这些概念一直以来都是云里雾里,团队开发过程中也总是处于混乱的状态,抓起来就用,本来是规范性的东西,却反而导致更加混乱了。

  今天我们把这些概念掰开揉碎来讲解一下,力求有一个清晰的理解,在开发中能有所助益。文中又理解不到位的,也欢迎大家斧正。

概念

  • VO(View Object):视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来。
  • DTO(Data Transfer Object):数据传输对象,这个概念来源于J2EE的设计模式,原来的目的是为了EJB的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的性能和降低网络负载,但在这里,更符合泛指用于展示层与服务层之间的数据传输对象。
  • BO(Business Object):业务对象,把业务逻辑封装为一个对象,这个对象可以包括一个或多个其它的对象。
  • PO(Persistent Object):持久化对象,它跟持久层(通常是关系型数据库)的数据结构形成一一对应的映射关系,如果持久层是关系型数据库,那么,数据表中的每个字段(或若干个)就对应PO的一个(或若干个)属性。
  • DO(Domain Object):领域对象,就是从现实世界中抽象出来的有形或无形的业务实体。

  如果光看这些概念,可能大部分人都理解,但还是很绕,具体用的时候还是不能很好区分,我们来横向做个比较,理解会加深一些。

易混点一:VO和DTO

首先VO是最常用的,但对于这个概念,网上也是众说纷纭,value object 或 view object,一般说视图对象或者值对象,我更倾向理解为视图对象。说白了它就是展示用的,不管展示方式是网页,还是客户端,还是APP,只要是这个东西是让人看到的,我们就把它封装为VO。

VO比较容易混淆的是DTO,DTO是展示层与服务层之间传递数据的对象,可以这样说,对于绝大部分的应用场景来说,DTO和VO的属性值基本是一致的,而且他们通常都是POJO,那么既然有了VO,为什么还需要DTO呢?

我们举例来说明一下:

某公司有一个后台服务,服务层有一个getUser的方法返回一个系统用户,包含sex(性别)、年龄。对于服务层来说,DTO只从语义上定义,可能是这样的:

{"gender":"男","age":35
}

但这个服务同时供多个客户端使用(不同门户),而不同的客户端对于表现层的要求有所不同,比如管理端要求显示准确的年龄,而应用端为了保护客户隐私,只需要显示一个年龄段即可。

管理端VO:

{"gender":"男","age":35
}

应用端VO:

{"gender":"男","age":30~40
}

从这个例子可以看出,DTO很有存在的必要,根据职责单一原则,服务层只负责业务,与具体的表现形式无关,DTO不应该出现与表现形式的耦合,DTO定义的是原始数据,VO再对DTO数据进行解释。这下VO和DTO用法就清晰很多了。

易混点二:BO和PO

PO是持久对象,这个很好理解,就是实体和数据库字段的对应,一个PO的数据结构对应着库中表的结构,表中的一条记录就是一个PO属性,大多数情况下,PO仅仅作为PO只是用来增删改使用。

PO比较容易混淆的是BO,BO是业务对象,对应的是某个具体的业务块,可以包含多个属性、对象。简单点来说,我们可以把BO看作是PO的组合。

我们举例来说明一下:

PO-1是交易记录对象,PO-2是登录记录对象,PO-3是商品浏览记录对象,PO-4是添加购物车记录对象,PO-5是搜索记录对象,BO是个人网站行为对象,BO对象:{PO-1;PO-2;PO-3;PO-4;PO-5}。这样做的优点不言而喻,维护代码的时候查看BO,就能知道这块逻辑涉及多少表(PO)。

易混点三:BO和DTO

搞清楚了BO和PO各自的用途后,我们会发现BO和DTO有重叠功能,一样可以对PO进行排列组合,那BO的存在的意义是什么呢?

从用途上进行根本的区别,BO是业务对象,DTO是数据传输对象,虽然BO也可以排列组合数据,但它的功能是对内的,比如上个例子中的BO对象包括{PO-1;PO-2;PO-3;PO-4;PO-5}还有其他字段属性,但在提供对外接口时,BO对象中的某些属性对象可能用不到或者不方便对外暴露,那么此时DTO只需要在BO的基础上,抽取自己需要的数据,然后对外提供。

在这个关系上,通常不会有数据内容的变化,内容变化要么在BO内部业务计算的时候完成,要么在解释VO的时候完成。

DO

DO是领域对象,就是从现实世界中抽象出来的有形或无形的业务实体。事实上,DO和PO在绝大部分情况下是一一对应的。阿里巴巴的开发手册中的定义DO等同于PO,即与数据库表结构一一对应,通过DAO层向上传输数据源对象。

上一张图,更加直观的展示这些名词使用的节点:

总结

VO,BO,PO,DTO这样分层还是很有意义的。尤其在团队成员较多的情况下,结构更加一目了然,同时也能很大程度避免多端系统数据所需不一致时,有人修改属性影响其他页面。但也完全没有必要教条主义,把这些全部用上,需要根据所开发的业务复杂度来取舍,如果本身业务逻辑不负责,照搬全上反而让开发变的更复杂。

例如业务不复杂,根本没有多端展示的差异化,VO可以直接拿掉,直接使用DTO传输到前端数据即可。

同时在使用过程中,最重要的是要在团队中达成共识,概念一致,如果使用了这些,但各按各的理解来,甚至抓起来就直接用,反而会让代码变得更乱,还不如直接POJO、DTO打天下。

另附这些概念命名规范:

  • 数据对象:xxxPO,xxx即为数据表名。(也可DO)
  • 数据传输对象:xxxDTO,xxx为业务领域相关的名称。
  • 展示对象:xxxVO,xxx一般为网页名称。
  • 业务对象:xxxBO,xxx是业务名称。

Java中的VO,BO,PO,DO,DTO相关推荐

  1. VO BO PO DO DTO DAO POJO概念及区别

    VO BO PO DO DTO DAO POJO 概念及区别 1.VO( value object) 即值对象 VO就是展示用的数据,不管展示方式是网页,还是客户端,还是APP,只要是这个东西是让人看 ...

  2. java web分层和层间数据传递 vo bo po (转载)

    还记得97年左右开始的胖客户机和瘦客户机之争吗?之后又是CS和BS之争,然后又是两层和多层之争...,十年之后的今天我们再回过头看这些争论,一切似乎看起来都那么理所应当:程序怎么能不分层啊?可是再想一 ...

  3. java web分层和层间数据传递 vo bo po

    还记得97年左右开始的胖客户机和瘦客户机之争吗?之后又是CS和BS之争,然后又是两层和多层之争...,十年之后的今天我们再回过头看这些争论,一切似乎看起来都那么理所应当:程序怎么能不分层啊?可是再想一 ...

  4. 转贴一个关于DTO DAO VO BO PO POJO的^_^

    DTO DAO VO BO PO POJO- - potian 写道: 辨别一些名词: 1.VO:实际上很模糊,通常指ValueObject和ViewObject 2. ViewObject,界面展现 ...

  5. POJO/DTO/DO/EO/VO/BO/PO/AO的含义和使用

    关于POJO/DTO/DO/EO/VO/BO/PO/AO 本文讨论 POJO/DTO/DO/EO/VO/BO/PO/AO 的定义,另外讨论了这些xO在controller.service.dao/ma ...

  6. vo、po、dto、bo、pojo、entity、mode如何区分

    Java Bean:一种可重用组件,即"一次编写,任何地方执行,任何地方重用".满足三个条件 类必须是具体的和公共的 具有无参构造器 提供一致性设计模式的公共方法将内部域或暴露成员 ...

  7. bo JAVA是什么意思_entity、bo、vo、po、dto、pojo如何理解和区分?

    Java开发过程中,基本实体类包都以entity或者model来称呼,可是不少项目中,却以Bo.Vo来命名,面试的时候,也有可能被问到这些问题.那么,这几者分别代表什么意思呢? Entity 最常用实 ...

  8. java中各种vo举例_了解JAVA中的POJO,Entity,PO,VO,DTO,DM包括代码举例展示

    标签: 首先是从概念上来说 POJO,全称Plain Ordinary Java Object,我理解为极其单纯的Java对象 一般只有属性字段,无参构造以及get和set方法,也是指那些没有从任何类 ...

  9. java中的vo 、dto 、dao--转

    原文地址:http://yinchunjian.iteye.com/blog/758196 O是跟数据库里表的映射,一个表对应一个VO  DAO是用VO来访问真实的表,对数据库的操作都在DAO中完成  ...

最新文章

  1. JQuery中的queue()及dequeue()
  2. SimpleDateFormat和DateFormat类不是线程安全的。
  3. python3中异常处理_python中的五种异常处理机制介绍|python3教程|python入门|python教程...
  4. 3-V2-类和对象 -- const内联 静态成员 友元
  5. [ NOIP 1998 ] TG
  6. linux 窗口管理器_您最喜欢的Linux窗口管理器是什么?
  7. 2013q3 android ios 用户接入网络方式pv占比分布,2012年移动互联网发展分析.pdf
  8. matlab画爱心代码分享
  9. different intergers
  10. 模仿笔迹最好的软件_模仿签名代写签字行业进入战国时代,乱战模式开启!
  11. 深度学习TF—8.经典CNN模型—LeNet-5、VGG13、AlexNet、GoogLeNet、ResNet、DenseNet
  12. [2019杭电多校第四场][hdu6623]Minimal Power of Prime
  13. Python: 爬虫与一个好美国股票数据网站---英为财情,
  14. 新装的电脑没有打开图片的软件怎么办?教你打开Windows照片查看器
  15. Android:如何优雅的开发马甲包?
  16. MSDC 4.3 接口规范(10)
  17. 【web前端特效源码】使用HTML5+CSS3+JavaScript制作一个扁平化风格css螃蟹图形~~适合初学者~超简单~ |前端开发|IT软件
  18. iOS新知识学习之React Native开发工具集
  19. Mac(Big Sur系统)安装tunnelblick(vpn)步骤
  20. java 多个PDF合成一个

热门文章

  1. Jenkins持续集成1
  2. 理科博士 自学计算机,他是物理学博士,因为爱情改学计算机,荣获图灵奖,毅然回国教书...
  3. 把自己当作品牌来经营
  4. jemter web端录制
  5. 高德地图报错updatePrivacyShow、updatePrivacyAgree若未正确设置有崩溃风险-解决方案
  6. vue中elementUi筛选后分页页码恢复到第一页
  7. Echart系列 | 绘制世界地图含中国各个省份(地图篇)(一)
  8. 关于MySQL数据库
  9. 宜春学院计算机专业排名,2019宜春学院专业排名
  10. linux系统参数调优