分层领域模型相关总结(DO/PO/VO/BO/DTO/Query等概念)

分层领域模型(DO/PO/VO/BO/DTO/Query等概念)


1. 为什么会有这么多O的概念?

各种分层概念的提出都是为了解耦,增加逻辑/代码的复用,便于后期维护/开发,提高团队开发效率;but,过多的细分也会使得开发过程相对复杂,模型之间转换频繁,影响效率


2. 怎么区分这些个O?

《阿里开发手册》提供的分层领域模型规约:

⚫ DO(Data Object):此对象与数据库表结构一一对应,通过 DAO 层向上传输数据源对象。

⚫ DTO(Data Transfer Object):数据传输对象,Service 或 Manager 向外传输的对象。

⚫ BO(Business Object):业务对象,可以由 Service 层输出的封装业务逻辑的对象。

⚫ Query:数据查询对象,各层接收上层的查询请求。注意超过 2 个参数的查询封装,禁止使用 Map 类来传输。

⚫ VO(View Object):显示层对象,通常是 Web 向模板渲染引擎层传输的对象。

⚫ PO(Persistent Object):指数据库表一 一对应的 POJO 类。此对象与数据库表结构一 一对应,通过 DAO 层向上
传输数据源对象,即Entity。

⚫POJO(Plain Ordinary Java Object):在本规约中,POJO 专指只有 setter / getter / toString 的简单类,包括
DO / DTO / BO / VO 等。

实际上,在给出的参考中并没有对模型对象进行非常明确的划分,特别是对BO、AO(Application Object)、DTO的界限不是非常明确。这也是因为系统处理的业务不同、复杂度不同导致的。所以在设计系统分层和建模的时候,需要综合考虑实际应用场景。

各个领域模型在分层上的传输关系大概是这样:
分层领域模型相关总结(DO/PO/VO/BO/DTO/Query等概念)_第1张图片


3. 常用转换工具类

各种分层,各种O,难免需要对象之前的转换,常用转换工具类:

一个是 org.springframework.beans.BeanUtils 包下的,一个是org.apache.commons.beanutils.BeanUtils 包下的

//org.springframework.beans.BeanUtils
public static void copyProperties(Object source, Object target){....}

//org.apache.commons.beanutils.BeanUtils
public static void copyProperties(Object dest,Object orig){....}

注意

  • ​ (1) org.apache.commons.beanutils.BeanUtils 和 org.springframework.beans.BeanUtils两个包中的 copyProperties 方法目标对象和源对象参数的位置是相反的。

  • ​ (2) 使用org.apache.commons.beanutils.BeanUtils进行copy对象时,被copy的对象(source/orig)中包含的字段目标对象(target/dest)必须包含,可以有其他的多于字段,类型可以不相同,但字段名称必须一
    致;org.springframework.beans.BeanUtils中的没有这个限制。

  • (3) BeanUtils.copyProperties使用起来虽然方便,但是它其实只是浅拷贝,所以如果类中都是单一的属性,则可以直接用;如果类中包含有其他的子类就需要考虑下拷贝后目标对象(target/dest)中包含被copy的对象(source/orig)中的子类是否有可能被修改,如果有可能被修改就不能直接使用。

.
.
.

参考:

  1. https://www.jianshu.com/p/a7f56a9b9c33/
  2. https://blog.csdn.net/qgnczmnmn/article/details/109384632
  3. https://zhuanlan.zhihu.com/p/102389552

你可能感兴趣的:(分层领域模型,DO/BO/VO/PO/DTO,后端分层概念)