DTO、VO、BO、PO等各种XO汇总

news2025/1/11 19:41:25

贫血模型和富领域模型

1.POJO对象(Plain Old Java Object)

Plain Old Java Object(POJO),它的本来含义是指一个常规的、不受任何框架、平台的约束和限制的Java对象。可以认为,如果一个模块定义的对象皆为POJO,那么除了依赖JDK,它不会依赖任何框架或平台。

POJO对象并非只有getter/setter的贫血对象,它的主要特征不在于它究竟定义了什么样的成员,而在于它作为一个常规的Java对象,并不依赖于除语言之外的任何框架。它的目的不是数据传输,也不是数据持久化,本质上,它是一种设计模式。

2.Java Bean

一个Java Bean类必须同时满足以下3个条件:

  • 类必须是具体的、公共的;
  • 具有无参构造函数;
  • 为内部字段提供规范的getter/setter方法。

它们都是为支持反射访问类成员而准备的前置条件,框架使用Java Bean,看重的其实是对象携带数据的能力,可通过反射访问对象的字段值来简化代码的编写。

3.贫血模型

贫血领域模型(anemic domain model),它违背了面向对象设计的关键原则,即“数据与行为应该封装在一起”。所谓的“血”就用来指代领域逻辑。

贫血领域模型与富领域模型,需要满足两点要求:

  • 领域模型仅仅封装领域逻辑,尽可能不掺杂访问外部资源如mybatis、redis、kafka等的技术实现;
  • 根据角色构造型分配职责,各司其职,共同协作。

各种“XO”

1.数据传输对象(data transfer object,DTO)

数据传输对象(data transfer object,DTO),用于在进程间传递数据的对象,目的是减少方法调用的数量。尽可能设计粗粒度的服务,粗粒度服务可以减少服务调用的次数,从而减少不必要的网络通信,同时也能避免对分布式事务的支持。

最好将其设计为一个Java Bean,即定义为公开的类,具有默认构造函数和getter/setter方法,这样就有利于一些框架通过反射来创建与组装。还应该是一个贫血对象,因为它的目的是传输数据,没有必要定义封装逻辑的方法,但可能需要为其定义转换方法。

2.视图对象(view object,VO)

视图对象(view object,VO)也是Java Bean中的一种。当然,我们也可以沿用DTO模式。由于它主要用于后端控制器服务和前端UI之间的数据传递,这样的视图模型对象自然也属于DTO对象的范畴。

3.业务对象(business object,BO)

业务对象(business object,BO)是用来描述业务概念的语义对象。业务对象的业务逻辑恰好也是领域驱动设计关注的核心,可认为领域驱动设计建立的领域模型皆是业务对象。为避免混淆,我建议不要在领域驱动设计中使用该概念。

4.领域对象(domain object,DO)

领域对象(domain object,DO)。领域模型对象同业务对象(business object,BO)。

DO也可以认为是数据对象(data object)的简称,两者容易混淆。

5.持久化对象(persistence object,PO)

持久化对象(persistence object,PO)。只要对象需要持久化,就会成为持久化对象,这与采用什么样的建模方法、什么样的设计方法没有关系。理想的领域模型对象应该是一个POJO或POCO,不依赖于除语言之外的任何框架。

6.数据访问对象(data access object,DAO)

数据访问对象(data access object,DAO)对持久化对象进行持久化,实现数据的访问。它可以持久化领域模型对象,但对领域模型对象的边界没有任何限制。

思维导图

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

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

相关文章

聚团队之力,学领军之道——麒麟信安组织开展卓越领导力主题培训

为提升高层次管理人员的领导力水平,为企业上市后高速发展以及高效运营提供更好支撑,日前,麒麟信安组织开展卓越领导力主题培训,公司领导层、各部门负责人以及各项目、技术骨干共同参加。 麒麟信安总裁刘文清作开训致辞。刘总指出&…

Python---练习:使用for循环实现用户名+密码认证

案例: 用for循环实现用户登录 ① 输入用户名和密码 ② 判断用户名和密码是否正确(usernamelaowang,passwordlw123) ③ 登录仅有三次机会,超过3次会报错 思考: 用户登陆情况有3种: ① 用户名错误(此时…

Ctrl+Alt+L或Ctrl+Alt+M或Ctrl+Alt+S热键无法启用(华硕天选)与armoury creat冲突

其实就是冲突了,但是就是检测不到(spy测不到,其他哪个open啥啥啥的直接进不去内核模式)。然后去找了个按键检测,发现都是找不到按键按下的事件,能检测到按键抬起事件,判断要么是应用占用&#x…

常见面试题-MySQL专栏(一)

为什么 mysql 删了行记录,反而磁盘空间没有减少? 答: 在 mysql 中,当使用 delete 删除数据时,mysql 会将删除的数据标记为已删除,但是并不去磁盘上真正进行删除,而是在需要使用这片存储空间时&…

vue源码分析(二)——vue的入口发生了什么

文章目录 前言(1)vue 项目构建的时候,通过package.json文件看到构建入口(2) 构建入口页面:导入同级模块config的getAllbuilds方法(3) 通过传入参数中的builds对象使用map获取&#x…

Python---for循环嵌套

for循环嵌套,就是一个for循环里面嵌套另外一个for循环的写法。 当循环结构相互嵌套时,位于外层的循环结构常简称为外层循环或外循环,位于内层的循环结构常简称为内层循环或内循环。 基本语法: # 外层循环 for i in 序列1:# 内层…

Typecho 添加 Emoji 表情报错「解决方案」

Typecho 添加 Emoji 表情报错 文章目录 Typecho 添加 Emoji 表情报错前言Emoji 表情utf8mb4 与 UTF8 解决方案[1] 数据库编码更改[2] 数据库配置文件更改 前言 Typecho 添加 Emoji 表情不支持,报错 Database Query Error Emoji 表情 Emoji 就是表情符号&#xff0c…

VMware Workstation提示:另一个程序已锁定文件的一部分,进程无法访问,删除.lck文件夹和文件

一、如图 二、原因 因为虚拟机在运行的时候,会锁定文件,防止被修改,而如果系统突然崩溃,虚拟机就来不急把已锁定的文件解锁。当你再次启动虚拟机的时候,会提示这类错误信息。 三、解决 进入虚拟机文件夹,…

node模块导出引入两种方式和npm包管理

模块化的好处 在 Node.js 中每个文件都被当做是一个独立的模块,模块内定义的变量和函数都是独立作用域的,因为 Node.js 在执行模块代码时,将使用如下所示的函数封装器对其进行封装 (function(exports,require,module,__filename,_dirname){//…

JavaScript-2-菜鸟教程

字符串 可以使用 索引 位置访问字符串中的每个字符 可以使用内置属性 length 来计算字符串的长度 var txt "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; var sln txt.length;<script>var x "John"; // x是一个字符串// 使用 new 关键字将字符…

p5.js 变换操作

本文简介 带尬猴&#xff0c;我嗨德育处主任 在 canvas 里&#xff0c;变换是基础功能。很多基于 canvas 封装的库都有这功能&#xff0c;比如 《Fabric.js 变换视窗》。 变换是针对画布进行全局调整的一种能力&#xff0c;它可以对画布进行全局移动、缩放、旋转等操作。 p5…

hibernate源码(2)--- springboot-jpa是如何引入的

starter引入 要想看jpa是如何将hibernate引入容器&#xff0c;首先要看的是 spring-boot-starter-data-jpa 如何引入依赖&#xff1a; 如果注意的话&#xff0c;starter的包内容其实没有什么实质的内容&#xff0c;关键是pom里的依赖 pom中规定了各依赖和依赖的版本&#xf…

python 过滤曲线噪点(滤波)

import numpy as np import matplotlib.pyplot as plt from scipy import signal# 生成示例信号 t np.linspace(0, 1, 1000) x np.sin(2 * np.pi * 5 * t) np.sin(2 * np.pi * 20 * t) np.random.randn(len(t)) * 0.2# 设计低通滤波器 order 3 # 滤波器阶数 cutoff_freq …

Linux--进程等待

1.什么是进程等待 1.通过系统调用wait/waitid,来对子进程进行进行检测和回收的功能。 2.为什么有进程等待 1.对于每个进程来说&#xff0c;如果子进程终止&#xff0c;父进程没有停止&#xff0c;就会形成僵尸进程&#xff0c;导致内存泄露&#xff0c;为了防止僵尸进程的形成…

【组合计数】CF1866 H

Problem - H - Codeforces 题意 思路 不知道这种trick叫什么&#xff0c;昨天VP刚遇到过 设 f[x] 为恰好有一个最大值为 x 的方案数&#xff0c;我们要求这个&#xff0c;那就设 g[x] 为 至少有一个最大值为 x 的方案数&#xff0c;那么答案就是 f[x] g[x] - g[x - 1] 这里…

等高度结构的顺序一致性

3( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 4( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 5( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 做3个网络,让网络的输入都只有3个节点&#xff0c; 一个网络的训练集有3张图片&#xff0c;一个网络的训练集有4张图片&#xff0c;一个网络的训练集有…

Zeth:首个Type 0 zkEVM

1. 引言 一年前&#xff0c;V神博客The different types of ZK-EVMs中指出&#xff1a; 以太坊初始设计未围绕ZK友好性&#xff0c;因此&#xff0c;以太坊协议的很多部分都需要大量计算来做ZK-prove。Type 1 zkEVM致力于精准复制以太坊&#xff0c;因此它没有办法减轻这些低…

Dockerfile文件自动化生成R4L镜像

Dockerfile文件自动化生成R4L镜像的步骤 1、安装Docker&#xff1a;2、使用Dockerfile一键生成镜像&#xff1a;3、查看生成的Docker镜像&#xff1a;4、删除Docker镜像&#xff1a;5、生成Docker容器&#xff1a;6、查看容器7、删除容器 1、安装Docker&#xff1a; curl -fsS…

小工具推荐:FastGithub的下载及使用

前言&#xff1a;FastGithub是基于dotnet开发的一款开源Github加速器&#xff0c;通过自动获取与GitHub相关的IP地址并更新本地hosts文件来提高资源访问速度&#xff0c;使GitHub的访问畅通无阻。原理&#xff08;复制过来的&#xff09;&#xff1a; ①修改本机的DNS服务指向…

Linux权限——“Linux”

各位CSDN的uu们好呀&#xff0c;今天&#xff0c;小雅兰的内容是Linux基本权限&#xff0c;下面&#xff0c;我们进入Linux的世界吧&#xff01;&#xff01;&#xff01; shell命令以及运行原理 Linux权限的概念 chmod ax /home/abc.txt file指令 目录的权限 关于权限的总…