文章目录
前言
Java是一门面向对象的语言,里面有众多的名词对象,比如分层领域模型里面的PO,VO,DAO…,这些名词都是什么意思呢?今天,咱们就来聊一聊。
解释各种名词之前,先放一张图,看完图估计就已经有了一个直观的感受了。
- 用户发出请求(可能是填写表单),表单的数据在展示层被匹配为VO。
- 展示层把VO转换为服务层对应方法所要求的DTO,传送给服务层。
- 服务层首先根据DTO的数据构造(或重建)一个DO,调用DO的业务方法完成具体业务。
- 服务层把BO转换为持久层对应的PO(可以使用ORM工具,也可以不用),调用持久层的持久化方法,把PO传递给它,完成持久化操作。
- 对于一个逆向操作,如读取数据,也是用类似的方式转换和传递。
一、VO是什么?
VO(View Object):显示层对象,通常是 Web 向模板渲染引擎层传输的对象。二、DTO是什么?
DTO(Data Transfer Object):数据传输对象,Service 或 Manager 向外传输的对象。通常用于处于不同架构层次或者不同子系统之间的数据传递,或者用于外部接口参数传递,以便提供不同粒度不同信息的数据,以免造成困惑干扰。但在这里,我泛指用于展示层与服务层之间的数据传输对象。
1.VO和DTO的区别
从设计层面来说,VO和DTO有着本质上的区别,DTO代表服务层需要接收的数据和返回的数据,而VO代表展示层需要显示的数据。所以,VO对象的属性可能会比DTO对象的属性少,且可能值不同。
举个例子:
servie层有个获取用户信息的方法,返回的DTO格式是这样的,其中的sex性别属性它只从语义上定义:1-男性,2-女性,0-未知
{
"name":"希留"
"sex":"1"
"age":"20"
}
而对于展示层来说,它可能需要用“帅哥”代表男性,用“美女”代表女性,用“秘密”代表未指定,且,不需要展示年龄age,所以VO就是
{
"name":"希留"
"sex":"帅哥"
}
2.VO和DTO的应用
VO和DTO在概念上是有区别的,但是在实际的项目开发中,根据具体的业务场景,实现上可以把VO与DTO合二为一(注意:是实现层面),比如:当需求非常清晰稳定,没有必要把VO和DTO区分开来,这时候VO可以退隐,用一个DTO即可,为什么是VO退隐而不是DTO?回到设计层面,服务层的职责依然不应该与展示层耦合,所以,拿前面的例子来说,DTO对于“sex”属性来说,值依然不能用“帅哥”,这个转换应该依赖于页面的脚本(js)或其他机制。
而在某些场景中,VO和DTO又需要并存。比如:某个页面内容比较多,需要一个“大视图”,而组成这个大视图的所有数据需要调用多个服务,返回多个DTO来组装。
三、BO是什么?
BO(Business Object):业务对象。可以理解为PO的组合,主要作用是把业务逻辑封装为一个对象,这个对象可以包括一个或多个其他的对象。比如一份简历,有教育经历、工作经历、社会关系等。可以把教育经历对应一个 PO,工作经历对应一个 PO,社会关系对应一个 PO,然后建立一个对应建立的 BO来处理简历,每个 BO 包含这些 PO,这样就可以针对 BO 去处理业务逻辑。
1.BO和DTO的区别
首先是概念上的区别,DTO是展示层和服务层之间的数据传输对象(可以认为是两者之间的协议),而BO是对现实世界各种业务角色的抽象,同时包含了数据和行为,是一个可以参与到领域逻辑中的完整对象。
四、PO是什么?
PO(Persistent Object):持久化对象,它跟持久层(通常是关系型数据库)的数据结构形成一一对应的映射关系,如果持久层是关系型数据库,那么,数据表中的每个字段(或若干个)就对应PO的一个(或若干个)属性。
简单来说:PO仅仅用于表示数据,没有任何数据操作,PO就是数据库中的记录,一个PO的数据结构对应着库中表的结构,表中的一条记录就是一个PO对象。通常PO里面除了get,set之外没有别的方法,等同于Entity,这俩概念是一致的。
五、DO是什么?
DO的概念现在主要有两个版本。
- 一个是阿里巴巴的开发手册中的定义,DO( Data Object)这个等同于上面的PO。
- 另一个是在DDD(Domain-Driven Design)领域驱动设计中,DO(Domain Object)这个等同于上面的BO。
六、DAO是什么?
DAO(Data Access Object):数据访问对象,用于表示一个数据访问对象,使用DAO访问数据库,包括插入、更新、删除、查询等操作,与PO一起使用,DAO一般在持久层,完全封装数据库操作,对外暴露的方法使得上层应用不需要关注数据库相关的任何信息。
基本没有互相转化的可能性和必要,主要用来封装对数据库的访问,通过它可以把POJO持久化为PO,用PO组装出来VO、DTO。
七、POJO是什么?
POJO(Plain Ordinary Java Object):简单普通的Java对象,一个POJO持久化以后就是PO,直接用它传递,传递过程就是DTO,直接用来对应表示层就是VO。
上面说的PO、VO、DTO统称为POJO,而DAO、BO一般都不是POJO,只是提供一些调用方法。
总结
以上就是今天要讲的内容, 到目前为止,相信大家都已经比较清晰的了解VO、DTO、DO、PO的概念了,但是在实际开发的过程中,并没有按照这种概念去实现,可能是一个VO类走天下。因为系统和系统的复杂度不同,协作水平不同,完全没有必要教条主义,把概念全用上。只需要同一个团队中保持概念一致就行。
感谢大家的阅读,如果有什么疑问或者建议,欢迎评论区指正,感谢~