java 中 DTO 和 VO 的核心區別

DTO 和 VO 的核心區別

特性DTO(數據傳輸對象)VO(視圖對象)
設計目的服務層與外部系統(如前端、其他服務)之間的數據傳輸為前端展示層定制數據,通常與 UI 強綁定
數據內容可能包含業務邏輯需要的字段(如 ID、狀態碼等)僅包含前端需要的字段,可能包含格式化后的數據
格式控制保持原始數據格式,不處理 UI 展示細節可能包含格式化后的日期、金額、多語言文本等
復用性可能被多個接口復用(如不同端的前端、App)通常針對特定頁面或組件定制,復用性較低
層級歸屬通常屬于服務層或接口層的模型屬于表現層(Controller 或前端直接使用的模型)

實際場景舉例

場景:訂單詳情接口
  1. DTO(Response 方向)

    java

    復制

    下載

    public class OrderDTO {private Long orderId;private BigDecimal amount;private LocalDateTime createTime; // 原始時間戳private String status;           // 業務狀態碼(如 "PAID")
    }
    • 用于服務層返回給 Controller 的原始數據。

    • 可能被多個消費者復用(如 App、H5、第三方系統)。

  2. VO(前端展示)

    java

    復制

    下載

    public class OrderVO {private String orderNo;          // 格式化的訂單號(如 "ORDER-20231001-001")private String displayAmount;    // 格式化后的金額(如 "¥199.00")private String createTime;       // 格式化后的時間(如 "2023-10-01 14:30")private String statusLabel;      // 狀態文案(如 "已支付")
    }
    • 由 Controller 或工具類將?OrderDTO?轉換而來。

    • 直接面向頁面展示需求,包含 UI 需要的額外字段(如狀態文案、格式化數據)。


為什么需要區分?

  1. 解耦業務邏輯與 UI 邏輯

    • DTO 保持業務數據的純粹性,VO 處理 UI 展示細節(如日期格式化、多語言)。

    • 修改 UI 展示邏輯時,無需影響服務層的 DTO。

  2. 避免接口污染

    • 如果直接返回 DTO 給前端,可能暴露敏感字段(如數據庫 ID、內部狀態碼)。

    • VO 可以隱藏不必要的字段,保障數據安全性。

  3. 適應多端差異

    • 同一 DTO 可能被不同端(Web、App、第三方)復用,但每個端的 VO 展示需求不同。

  4. 代碼可維護性

    • 當 UI 展示邏輯變化時(如狀態碼映射調整),只需修改 VO 轉換邏輯,無需改動服務層代碼。


目錄結構建議

如果項目中 DTO 和 VO 的職責明確,可以進一步細分目錄:

bash

復制

下載

src/main/java/com/example/project/
└── model/├── dto/│   ├── request/   # 入參 DTO(如 OrderCreateRequest)│   └── response/  # 出參 DTO(如 OrderResponse)└── vo/            # 視圖對象(如 OrderDetailVO)

什么情況下可以合并?

小型項目簡單接口中,如果以下條件滿足,可以合并 DTO 和 VO:

  1. 前端展示字段與 DTO 完全一致。

  2. 無需隱藏敏感字段。

  3. 沒有多端復用需求。

但需注意:隨著項目復雜度上升,合并后的模型可能難以擴展。


總結

  • DTO?是面向接口的通用傳輸模型,關注數據完整性跨系統兼容性

  • VO?是面向 UI 的定制模型,關注展示友好性安全性

  • 兩者分離是分層架構的體現,能顯著提升代碼的靈活性和可維護性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/81045.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/81045.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/81045.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據結構【二叉樹的遍歷實現】

📘考研數據結構基礎:二叉樹的存儲、遍歷與隊列輔助實現詳 在數據結構的學習中,二叉樹作為一種結構清晰、應用廣泛的樹形結構,是考研計算機專業課中重點內容之一。本文將以實際代碼為基礎,介紹二叉樹的存儲結構、遍歷方…

無人機俯視風光攝影Lr調色預設,手機濾鏡PS+Lightroom預設下載!

調色詳情 無人機俯視風光攝影 Lr 調色是利用 Adobe Lightroom 軟件,對無人機從俯視角度拍攝的風光照片進行后期處理的調色方式。通過調整色彩、對比度、光影等多種參數,能夠充分挖掘并強化畫面獨特視角下的壯美與細節之美,讓原本平凡的航拍風…

【springcloud學習(dalston.sr1)】Eureka服務端集群的搭建(含源代碼)(二)

該系列項目整體介紹及源代碼請參照前面寫的一篇文章【springcloud學習(dalston.sr1)】項目整體介紹(含源代碼)(一) 這篇文章主要介紹多個eureka服務端的集群環境是如何搭建的。 (一)eureka的簡要說明 Eu…

互聯網大廠Java求職面試實戰:Spring Boot微服務與數據庫優化詳解

💪🏻 1. Python基礎專欄,基礎知識一網打盡,9.9元買不了吃虧,買不了上當。 Python從入門到精通 😁 2. 畢業設計專欄,畢業季咱們不慌忙,幾百款畢業設計等你選。 ?? 3. Python爬蟲專欄…

事件驅動reactor的原理與實現

fdset 集合:(就是說) fd_set是一個位圖(bitmap)結構 每個位代表一個文件描述符 0表示不在集合中,1表示在集合中 fd_set結構(簡化): [0][1][2][3][4][5]...[1023] …

一分鐘在Cherry Studio和VSCode集成火山引擎veimagex-mcp

MCP的出現打通了AI模型和外部數據庫、網頁API等資源,成倍提升工作效率。近期火山引擎團隊推出了 MCP Server SDK: veimagex-mcp。本文介紹如何在Cherry Studio 和VSCode平臺集成 veimagex-mcp。 什么是MCP MCP(Model Context Protocol&…

掌控隨心 - 服務網格的流量管理藝術 (Istio 實例)

掌控隨心 - 服務網格的流量管理藝術 (Istio 實例) 想象一下,沒有服務網格的時候,我們要實現像“將 1% 的用戶流量導入到新版本應用”、“根據用戶設備類型訪問不同后端”、“模擬下游服務故障”這類高級流量策略,通常需要在代碼、負載均衡器、API 網關等多個地方進行復雜且分…

[ARM][匯編] 01.基礎概念

目錄 1.全局標號 1.1.使用方法 1.1.1.聲明全局標號 1.1.2.定義全局標號 1.1.3.引用全局標號 1.2.全局標號與局部標號的區別 1.3.注意事項 2.局部標號 2.1.使用方法 2.1.1.定義局部標號 2.1.2.跳轉引用 2.2.局部標號與全局標號的對比 2.3.注意事項 3.符號定義偽指…

如何使用遠程桌面控制電腦

目的: 通過路由器使用pc控制臺式機,實現了有線/無線pc與臺式機的雙向遠程桌面控制 最核心就兩條:get ip地址與被控制機器的賬戶與密碼。 現象挺神奇:被控制電腦的電腦桌面處于休眠模式,此時強行喚醒被控電腦會導致中斷…

Hive表JOIN性能問

在處理100TB的Hive表JOIN性能問題時,需采用分層優化策略,結合數據分布特征、存儲格式和計算引擎特性。以下是系統性優化方案: 1. 數據傾斜優化(Skew Join) 1.1 識別傾斜鍵 方法:統計JOIN鍵的分布頻率&…

MongoDB 的核心概念(文檔、集合、數據庫、BSON)是什么?

MongoDB 是一個面向文檔的數據庫,它的核心概念與傳統的關系型數據庫(RDBMS)有所不同。以下是它的四個主要核心概念: 文檔 (Document) 定義: 文檔是 MongoDB 中的基本數據單元。它類似于關系型數據庫中的一行記錄&#…

AI智慧公園管理方案:用科技重塑市民的“夜游體驗”

AI智慧公園管理方案:多場景智能巡檢與安全防控 一、背景與痛點分析 夏季夜間,公園成為市民休閑娛樂的核心場所,但管理難度隨之激增: 寵物管理失控:未牽繩寵物進入園區,隨地排泄、驚擾游客,甚…

Spring Cloud Gateway 聚合 Swagger 文檔:一站式API管理解決方案

前言 在微服務架構中,隨著服務數量的增加,API文檔管理變得越來越復雜。每個微服務都有自己的Swagger文檔,開發人員需要記住每個服務的文檔地址,這無疑增加了開發難度。本文將介紹如何使用Spring Cloud Gateway聚合所有微服務的Sw…

尼康VR鏡頭防抖模式NORMAL和ACTIVE的區別(私人筆記)

1. NORMAL 模式(常規模式) 適用場景:一般手持拍攝,比如人像、靜物、風景或緩慢平移鏡頭(如水平追拍)等。工作特性: 補償手抖引起的小幅度震動(比如手持時自然的不穩)&am…

Babylon.js學習之路《四、Babylon.js 中的相機(Camera)與視角控制》

文章目錄 1. 引言:為什么相機是 3D 場景的“眼睛”?1.1 相機的核心作用1.2 常見相機類型概覽 2. 相機基礎參數解析2.1 通用屬性2.2 相機坐標系 3. 詳解常用相機類型3.1 自由相機(FreeCamera)3.2 弧形旋轉相機(ArcRotat…

【Python】普通方法、類方法和靜態方法的區分

Python 中普通方法、類方法和靜態方法的區分 下面我將從多個維度對這三種方法進行詳細對比,并通過示例說明它們的使用場景和區別。 1. 核心區別總結 特性普通方法(實例方法)類方法(classmethod)靜態方法(staticmethod)定義裝飾器無classmethodstaticmethod第一個…

geoserver發布arcgis瓦片地圖服務(最新版本)

第一步:下載geoserver服務,進入bin目錄啟動 需要提前安裝好JDK環境,1.8及以上版本 安裝完成,頁面訪問端口,進入控制臺界面,默認用戶名密碼admin/geoserver 第二步:下載地圖 破解版全能電子地圖下載器&…

Linux服務之lvs集群與dr模式部署

目錄 一.lvs相關概述 1.lvs集群的工作模式 2.lvs調度算法 3.ipvsadm工具 二.DR模式部署 一.lvs相關概述 1.lvs集群的工作模式 lvs-nat:修改請求報文的目標IP,多目標IP的DNAT lvs-dr:操縱封裝新的MAC地址(直接路由)lvs-tu…

OFCMS代碼審計-freemaker注入sql注入xxexss文件上傳

環境搭建 下載地址&#xff1a;https://gitee.com/oufu/ofcms/repository/archive/V1.1.2?formatzip SSTI模板注入&#xff08;freemaker) FreeMarker模板注入實現遠程命令執行 - Eleven_Liu - 博客園 在admin中找到這個 發現請求的是這個 找到他 <#assign value"f…

一鍵部署NSFW檢測模型:快速識別并過濾敏感圖片內容

以下是對nsfw_detector的簡單介紹&#xff1a; nsfw_detector是一個 NSFW 內容檢測器&#xff0c;支持快速docker私有部署&#xff0c;提供API服務低資源消耗&#xff0c;2GB內存即可運行該模型&#xff0c;多核CPU自動調度加速推理 - 可以識別多種文件類型&#xff1a;圖片、…