软件架构设计 :VO,BO,PO,DO,DTO的理解

news2024/12/24 21:07:46

文章目录

  • 前言
  • 一、小总结一下
  • 二、详细理解
    • 1、Persistant Object(持久对象)
      • 个人理解
    • 2、 Business Object(业务对象)
      • 个人理解
    • 3.DTO(Data Transfer Object)数据传输对象
      • 个人理解
    • 5、VO(Value Object)值对象
      • 个人理解
      • VO和DTO的区别
    • 6、BO/DO
    • 7、DAO
  • 大体联系
  • 实际应用
  • 参考文章


前言

最开始的理解service dao controller 后面随着业务的加深 针对VO BO PO DO DTO 以及POJO 都有些懵 所以参考网上的资料 自己总结一部分

其实这些都是前端和后端的交互方式 通过这种解耦合的方式来使得以后升级业务更加方便


一、小总结一下

①VO (View Object):与前端进行交互的视图对象,可以把指定页面(组件)的所有数据封装起来。只包含前端需要展示的数据,如数据创建时间、更新时间等前端不需要展示的数据,处于减少传输数据量大小和保护数据库结构不外泄的目的,不在VO中体现

②DTO(Data Transfer Object):通常用户展示层(Controller)和服务层(Service)之间的数据传输对象。DTO与VO概念相似,通常情况下字段基本一致,但二者设计理念又不同,比如API服务需要使用的DTO就可能与VO存在差异。一个服务层方法可能被多个展示层方法调用,而传给前端的VO只有DTO的一部分信息,不同请求给前端看到的数据不一样,所以DTO是共用的,VO是个性化的

③DO(Data Object):持久化对象,它跟持久层(Dao)的数据结构形成一一对应的映射关系,通过DAO层向上传输数据源对象

④BO(Business Object) :业务对象,可以由Service层输出的封装业务逻辑的对象,这个对象可以包括一个或多个其他的对象。比如一个简历,有教育经历、工作经历、社会关系等等。我们可以把教育经历对应一个PO,工作经历对应一个PO,社会关系对应一个PO。建立一个对应简历的BO对象处理简历,每个BO包含这些PO。这样处理业务逻辑时,我们就可以针对BO去处理。

⑤PO(Persistant Object):持久对象,用于表示数据库中的一条记录映射成的Java对象,仅用于表示数据没有任何数据操作,拥有getter/setter方法

⑥POJO(Plain ordinary java object) :简单java对象,POJO持久化后就是PO

⑦DAO(Data access object): 数据访问对象,封装对数据库的访问,可以把POJO持久化为PO,用PO组装出VO、DTO

⑧一般的数据传递是,前端传递VO给接口(Controller),接口将VO转为DTO传递给service,service将DTO分解为DO,调用领域服务进行调度,然后逆向转为VO或者其他的返回结果,传递给前台。

二、详细理解

1、Persistant Object(持久对象)

PO就是数据库中的记录,一个PO的数据结构对应着库中表的结构,表中的一条记录就是一个PO对象
通常PO里面除了get,set之外没有别的方法
对于PO来说,数量是相对固定的,一定不会超过数据库表的数量
等同于Entity,这俩概念是一致的

个人理解

大白话就是等同于Entity实体类。直接与操作数据库的crud相关。

例:个人信息表中分别有:id,name,age,sex,birthday

则PO对象中的属性有:id,name,age,sex,birthday

{“id”: 1,“name”: “张三”,“age”: 20,“sex”: “男”,“birthday”: “2000-03-24”}

2、 Business Object(业务对象)

PO是一条交易记录,BO是一个人全部的交易记录集合对象
复杂点儿的例子PO1是交易记录,PO2是登录记录,PO3是商品浏览记录,PO4是添加购物车记录,PO5是搜索记录,BO是个人网站行为对象
BO是一个业务对象,一类业务就会对应一个BO,数量上没有限制,而且BO会有很多业务操作,也就是说除了get,set方法以外,BO会有很多针对自身数据进行计算的方法

个人理解

简单来说就是你需要前端传入哪些字段数据,将这些字段封装一个实体类,用来操作数据库表。假如说你要根据ID去查某一条数据,就在这个类中写一个 String id。(举例说明),正常是两个以上字段

例:个人信息表中分别有:id,name,age,sex,birthday

个人学历表中分别有:id,school,educational_background

按照个人信息表与学历表进行关联,将用户的个人信息集合在一起。

则BO对象中可以是两个表信息的组合:id,name,age,sex,birthday,school,educational_background

{“id”: 1,“name”: “张三”,“age”: 20,“sex”: “男”,“birthday”: “2000-03-24”,“school”:“五道口”,“educational_background”:“本科”}

为什么BO也画成横跨两层呢?原因是现在很多持久层框架自身就提供了数据组合的功能,因此BO有可能是在业务层由业务来拼装PO而成,也有可能是在数据库访问层由框架直接生成
很多情况下为了追求查询的效率,框架跳过PO直接生成BO的情况非常普遍,PO只是用来增删改使用

3.DTO(Data Transfer Object)数据传输对象

在后端,他的存在形式是java对象,也就是在controller里面定义的那个东东,通常在后端不需要关心怎么从json转成java对象的,这个都是由一些成熟的框架帮你完成啦,比如spring框架
在前端,他的存在形式通常是js里面的对象(也可以简单理解成json),也就是通过ajax请求的那个数据体

个人理解

简单来说就是你需要前端传入哪些字段数据,将这些字段封装一个实体类,用来操作数据库表。假如说你要根据ID去查某一条数据,就在这个类中写一个 String id。(举例说明),正常是两个以上字段

例:个人信息表中分别有:id,name,age,sex,birthday

个人学历表中分别有:id,school,educational_background

按照个人信息表与学历表进行关联,将用户的个人信息集合在一起。

则BO对象中可以是两个表信息的组合:id,name,age,sex,birthday,school,educational_background

{“id”: 1,“name”: “张三”,“age”: 20,“sex”: “男”,“birthday”: “2000-03-24”,“school”:“复旦大学”,“educational_background”:“本科”}

5、VO(Value Object)值对象

Value Object(值对象),可以理解为展示要用的数据,传递到前端页面上,直接进行展示。为了保证数据可以直接展示使用,就要对数据进行处理。

个人理解

VO就是展示用的数据,不管展示方式是网页,还是客户端,还是APP,只要是这个东西是让人看到的,这就叫VO,VO主要的存在形式就是js里面的对象(也可以简单理解成json)

例:个人信息表中分别有:id,name,age,sex,birthday

我们需要展示的是用户的当前状态,像年龄和性别则没有必要分开显示,可以进行合并。

则vo对象中的信息为:id,name,type,birthday

{“id”: 1,“name”: “张三”,“type”:“少年”,“birthday”: “2000-03-24”}

VO和DTO的区别

主要有两个区别
一个是字段不一样,VO根据需要会删减一些字段
另一个是值不一样,VO会根据需要对DTO中的值进行展示业务的解释
举个简单的例子
DTO可能是这样的

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

对于业务一来说只需要性别,而且因为是一个古风聊天室,也不能直接展示男,因此经过业务解释业务一的VO是

{
	"gender":"公子"
}

对于业务二来说只需要年龄,而且不需要精确的年龄,因此经过业务解释业务二的VO是

{
	"age":"30~39"
}

6、BO/DO

    DO (domain object)领域实体对象,现在主要有两个版本:

①阿里巴巴的开发手册中的定义,DO( Data Object)这个等同于上面的PO

②DDD(Domain-Driven Design)领域驱动设计中,DO(Domain Object)这个等同于上面的BO

7、DAO

ata access object(数据访问对象)。此对象用于访问数据库。通常和 PO 结合使用, DAO 中包含了各种数据库的操作方法。通过它的方法 , 结合 PO 对数据库进行相关的操作。夹在业务逻辑与数据库资源中间。

大体联系

在这里插入图片描述

实际应用

有的PO可能不需要扩充,直接删减得到DTO,也可能不用删减,直接使用。从DTO也可能不需要再处理就可以直接到页面显示,和VO无甚差别。
1,PO这个没法省,不管叫PO还是Entity,怎么着都得有
2,一些工具类的系统和一些业务不是很复杂的系统DTO是可以和BO合并成一个,当业务扩展的时候注意拆分就行
3,VO是可以第一个优化掉的,展示业务不复杂的可以压根儿不要,直接用DTO
4,这也是最重要的一条,概念是给人用的,多人协作的时候一定要保证大家的概念一致,赶紧把这篇文章转发给跟你协作的人吧

参考文章

https://blog.csdn.net/cowcomic/article/details/103751308
https://blog.csdn.net/qq_41854784/article/details/126895509
https://zhuanlan.zhihu.com/p/396192444
https://zhuanlan.zhihu.com/p/264675395

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/77334.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

web前端期末大作业 html+css+javascript化妆品网页设计实例 企业网站制作

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

c++ - 第16节 - map和set

1.关联式容器 在初阶阶段,我们已经接触过STL中的部分容器,比如:vector、list、deque、forward_list(C11)等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。那什么是关联…

【Linux】进程控制(详细解析)

文章目录一.进程创建初识fork函数fork函数返回值写时拷贝fork常规用法fork调用失败的原因二.进程终止进程退出场景进程退出码进程常见退出方法1.return2.exit3._exit三.进程等待进程等待的必要性获取子进程状态status进程等待的方法wait方法waitpid方法基于非阻塞接口的轮询检测…

python操作redis

目录 python操作redis 安装redis模块 基本链接 连接池连接 redis字符串操作 redis hash操作 redis 列表操作 redis 其它操作 redis管道 django中集成redis python操作redis 安装redis模块 pip install redis基本链接 # 第一步:导入Redis类 from redis …

Linux网络原理及编程(7)——第十七节 网络层

目录 IP报头 网段划分 私有IP地址和公网IP地址 补充一下路由器 的有关知识: 路由 各位好,博主新建了个公众号《自学编程村》,拉到底部即可看到,有情趣可以关注看看哈哈,关注后还可以加博主wx呦~~~(公众…

【玩转c++】c++ 中 STL 简介

本期主题:介绍cSTL(标准模板库)博客主页:小峰同学分享小编的在Linux中学习到的知识和遇到的问题小编的能力有限,出现错误希望大家不吝赐身为程序员 ,不会有人没有女朋友吧。 🍁1.什么是STL&…

[趣味][人工智能生成文字]chatGPT使用教程

ChatGPT 首先点击sign up注册,注册需要非中国手机号获取验证码,这里感谢一下alice的支援,没有好朋友的各位看到这里可以先去逛逛淘宝 注册后点击log in登录 然后直接输入想要生成的内容,点击右侧的小箭头 注意:根据Op…

cef浏览器加载过程实测ILoadHandler和IRequestHandler

针对方法GetResourceRequestHandler获取资源请求过程中,会多次发生请求,不知道何时加载完的问题,IRequestHandler没有了OnResourceLoadComplete和OnBeforeResourceLoad方法,如何判断是否加载完。使用browser.isLoading并不能真正的判断。所以想到了 OnFrameLoadEnd OnFram…

【STM32】详解独立看门狗的本质和使用步骤代码

一、看门狗 1、介绍 作为一个检测装置,发生意外情况能够报告并处理突发意外——复位。 复位中断属于不可屏蔽中断,属于优先级最高的中断 2、作用 两个看门狗(独立看门狗和窗口看门狗)均可用于检测并解决由软件错误导致的故障&…

设计没灵感,一定要逛这5个网站。

本期给大家分享几个设计灵感网站,希望对设计师们有所帮助,话不多说直接上内容。 1、dribbble Dribbble - Discover the World’s Top Designers & Creative Professionals Dribble是一个很大的设计作品共享网站,也涵盖了很丰富的设计作…

HTTP 和 HTTPS 它们之间的区别在哪里?

您可能已经听说过很多有关互联网术语 HTTP 和 HTTPS 的信息。您知道两者之间的区别是什么吗?HTTP 在随着技术的不断更新已经慢慢开始消失在互联网之中。在浏览器的地址栏中,您访问的每个网站的 URL 始终以 HTTP 或 HTTPS 开头,而目前 HTTPS 协…

SSM校园网报修系统计算机毕业论文java毕业设计选题源代码

💖💖更多项目资源,最下方联系我们✨✨✨✨✨✨ 目录 Java项目介绍 资料获取 Java项目介绍 《SSM校园网报修系统》该项目采用技术:jsp springmvcspringmybatis cssjs等相关技术,项目含有源码、文档、配套开发软件、…

02源码分析-ThreadLocal详解-并发编程(Java)

文章目录1 ThreadLocal内部结构2 主要方法源码分析2.1 set()方法2.1.1 getMap()2.1.2 createMap()2.1.3 ThreadLocalMap.set()2.1.4 replaceStaleEntry()2.1.5 expungeStaleEntry()2.1.6 cleanSomeSlots()2.1.7 rehash()2.1.8 expungeStaleEntries()2.1.9 resize()2.2 get()方法…

Minitab使用图形渲染和数据描述

Minitab使用图形渲染和数据描述 Minitab是最流行的质量、分发和分析程序之一,实际上是OMNITAB软件的一个较小版本。六西格玛的软件是开发组织质量开发和改进的合适工具,具有处理、计算、分析、报告和其他数据工具的强大能力。的确如此。在本软件的上下文…

HTML列表与表格详解_高效学习攻略

HTML列表与表格HTML篇_第六章、HTML列表与表格一、列表1.1定义1.2列表的分类1.3列表的对比二、表格2.1表格的定义2.2表格的边框2.3表格的表头单元格2.4表格标题 <caption>2.5表格的高度和宽度2.6表格背景2.7表格空间2.8合并单元格2.9表格头部、主题和页脚2.10表格的嵌套H…

《可解释机器学习公开课》来了!

Datawhale开源 联合发布&#xff1a;同济子豪兄、Datawhale文章目录1.什么是机器学习的可解释性分析。2.学可解释机器学习有什么用&#xff1f;3.可解释机器学习开源学习计划&#xff0c;同济子豪兄和 Datawhale 联合发布。什么是可解释AI现代的机器学习和人工智能&#xff0c;…

redis 的雪崩、穿透和击穿

面试题 了解什么是 redis 的雪崩、穿透和击穿&#xff1f;redis 崩溃之后会怎么样&#xff1f;系统该如何应对这种情况&#xff1f;如何处理 redis 的穿透&#xff1f; 面试官心理分析 其实这是问到缓存必问的&#xff0c;因为缓存雪崩和穿透&#xff0c;是缓存最大的两个问…

【C++】list的模拟实现来咯

文章目录一、整体框架二、迭代器1、list迭代器的引入2、迭代器的区分3、list迭代器的实现4、模板三、增删查改1、insert和erase2、push_back和push_front3、pop_back和pop_front四、list的接口1、构造2、析构3、赋值重载五、list和vector的对比一、整体框架 list的本质就是带头…

中润光学通过科创板注册:预计年营收4亿 拟募资4亿

雷递网 雷建平 12月9日嘉兴中润光学科技股份有限公司&#xff08;简称&#xff1a;“中润光学”&#xff09;日前通过注册&#xff0c;准备在科创板上市。中润光学计划募资4.05亿&#xff0c;其中&#xff0c;2.7亿元用于高端光学镜头智能制造项目&#xff0c;5629万元用于高端…

【HDU No. 2243】单词情结 考研路茫茫——单词情结

【HDU No. 2243】单词情结 考研路茫茫——单词情结 杭电OJ 题目地址 【题意】 单词和词根仅由小写字母组成。给定N个词根&#xff0c;求长度不超过L 且至少包含一个词根的单词可能有多少个&#xff1f; 若有两个词根aa和ab&#xff0c;则长度不超过3且至少包含一个词根的单词…