
面对这个图,让我们先从承上启下的 DTO 开始入手
# DTO(Data Transfer Object)数据传输对象
这个传输通常指的前后端之间的传输 DTO 是一个比较特殊的对象,他有两种存在形式:① 在后端,他的存在形式是 java 对象,也就是在 controller 里面定义的那个,通常在后端不需要关心怎么从 json 转成 java 对象的,这个都是由一些成熟的框架帮你完成,比如 spring 框架。② 在前端,他的存在形式通常是 js 里面的对象(也可以简单理解成 json),也就是通过 ajax 请求的那个数据体
服务和服务之间调用的传输对象能叫 DTO 吗?
DTO 本身的一个隐含的意义是要能够完整的表达一个业务模块的输出。
如果服务和服务之间相对独立,那就可以叫 DTO。
如果服务和服务之间不独立,每个都不是一个完整的业务模块,拆开可能仅仅是因为计算复杂度或者性能的问题,那这就不能够叫做 DTO,只能是 BO。
# VO(Value Object)值对象
VO 就是展示用的数据,不管展示方式是网页,还是客户端,还是 APP,只要是这个东西是让人看到的,这就叫 VO。VO 主要的存在形式就是 js 里面的对象(也可以简单理解成 json)
# VO 和 DTO 的区别
主要有两个区别一个是字段不一样,VO 根据需要会删减一些字段另一个是值不一样,VO 会根据需要对 DTO 中的值进行展示业务的解释 DTO 可能是这样的:
{ | |
"gender":"男", | |
"age":35 | |
} |
VO 可能是:
{ | |
"gender":"公子" | |
} |
# PO(Persistant Object)持久对象
PO 比较好理解简单说 PO 就是数据库中的记录,一个 PO 的数据结构对应着库中表的结构,表中的一条记录就是一个 PO 对象通常 PO 里面除了 get,set 之外没有别的方法对于 PO 来说,数量是相对固定的,一定不会超过数据库表的数量等同于 Entity,这俩概念是一致的
# BO(Business Object)业务对象
BO 就是 PO 的组合。简单的例子比如说 PO 是一条交易记录,BO 是一个人全部的交易记录集合对象复杂点儿的例子 PO1 是交易记录,PO2 是登录记录,PO3 是商品浏览记录,PO4 是添加购物车记录,PO5 是搜索记录,BO 是个人网站行为对象。BO 是一个业务对象,一类业务就会对应一个 BO,数量上没有限制,而且 BO 会有很多业务操作,也就是说除了 get,set 方法以外,BO 会有很多针对自身数据进行计算的方法为什么 BO 也画成横跨两层呢?原因是现在很多持久层框架自身就提供了数据组合的功能,因此 BO 有可能是在业务层由业务来拼装 PO 而成,也有可能是在数据库访问层由框架直接生成很多情况下为了追求查询的效率,框架跳过 PO 直接生成 BO 的情况非常普遍,PO 只是用来增删改使用。
# BO 和 DTO 的区别
这两个的区别主要是就是字段的删减 BO 对内,为了进行业务计算需要辅助数据,或者是一个业务有多个对外的接口,BO 可能会含有很多接口对外所不需要的数据,因此 DTO 需要在 BO 的基础上,只要自己需要的数据,然后对外提供在这个关系上,通常不会有数据内容的变化,内容变化要么在 BO 内部业务计算的时候完成,要么在解释 VO 的时候完成
# DO( Data Object)
现在主要有两个版本一个是阿里巴巴的开发手册中的定义 DO( Data Object)这个等同于上面的 PO 另一个是在 DDD(Domain-Driven Design)领域驱动设计中 DO(Domain Object)这个等同于上面的 BO