一、概念讲解
-
VO(View/Value Object)—— 视图对象
-
DTO(Data Transfer Object)—— 数据传输对象
-
BO(Business Object)—— 业务对象
-
PO(Persistent Object)—— 持久对象
-
DO(Data/Domain Object)—— 数据/领域对象
-
POJO(Plain Old/Ordinary Java Object)—— 以上模型的统称
POJO
是简单的Java
对象,不包含业务逻辑、能够控制自己内部所有属性访问的Java
对象。
二、概念澄清
-
JavaBean VS POJO
JavaBean POJO 没有业务逻辑 没有业务逻辑 必须构造函数 无需构造函数 private 修饰成员变量 成员变量的修饰符无限制 P.S
JavaBean 其实是 POJO 的一种形式(JavaBean < POJO)
三、使用场景
-
网摘关系图
-
DTO(Data Transfer Object)数据传输对象
数据传输对象比较特殊,之所以将
DTO
绘制在展示层
和业务逻辑层
之间,是因为它有两种存在形式:- 前端:它是以
Json
字串的形式存在 - 后端:它是以
Java
对象的形式存在
微服务之间
DTO
对象的模型鉴定形式:- 服务(模块)与服务(模块)之间相对独立,我们可以将数据传输对象命名为
DTO
- 服务(模块)与服务(模块)之间不是独立,每一个都不是一个完整的业务模块,拆分可能仅仅是因为计算复杂度或者性能问题考虑拆分的问题,那么就不能将对象命名为
DTO
,只能是BO
- 前端:它是以
-
VO(View/Value Object)—— 视图对象
VO
就是展示用的数据,不管展示方式是网页、客户端、APP
,只要是这些数据用于展示给人看的就是VO
-
VO VS DTO
- 区别一:
字段可能不一样,VO
会根据实际情况,对字段有所删减 - 区别二:
属性值可能不一样,VO
会根据DTO
中对值进行展示业务对解释(比如:为不暴露数据库字段,修改属性名称、敏感字段不展示等等)
- 区别一:
-
PO(Persistent Object)—— 持久对象
简单的说
PO
就是数据库中的记录,一个PO
的数据结构对应着库中的表结构,表中的一条记录就是一个PO
对象。对于PO
来说,数量是相对固定的,不会超过数据库中表的数量。等同于Entity
,它两概念是一致的。 -
BO(Business Object)—— 业务对象
BO
就是PO
的组合- 简单解释:
比如:PO
是一个交易记录,BO
就是一个人全部的交易记录集合对象 - 复杂解释:
比如:PO1
是交易记录,PO2
是登录记录、PO3
是商品浏览记录、PO4
是添加购物记录,BO
就是个人网站行为对象
- 简单解释:
-
DO VS DTO
这两个的区别主要也是字段的删减。
BO
对内,为了进行业务计算需要辅助数据或者一个业务有多个对外接口,BO
可能会含有很多接口对外所不需要的数据,因此DTO
需要在BO
的基础上选取自己所需的数据赋值。 -
DO(Data/Domain Object)—— 数据/领域对象
- 阿里开发手册
DO
等同于PO
DDD
领域驱动设计
DO
等同于BO
- 阿里开发手册
四、经验总结
PO(Entity)
这个是没有办法省略的,所有涉及数据库操作的都需要有持久化对象- 不是非常大型的简单系统,
DTO
和BO
可以合并为一个,当业务扩展的时候注意拆分即可 - 概念是给人用的,多人协作的时候一定要保证大家的概念一致。请勿形而上学、过度设计、一切设计都基于现有的业务规则和系统大小