4.8 传输对象模式
传输对象模式(Transfer Object,也叫 DTO,Data Transfer Object)用一个简单的、只装数据的对象,把多项数据打包,在系统的不同层之间(尤其是跨网络)一次性传输。它要解决的痛点非常具体:跨网络逐个调用 getter,会产生大量昂贵的远程往返。
设想一个远程的 Customer 对象,你想要它的姓名、邮箱、电话、地址、等级——如果每个字段都是一次远程调用,就是五次网络往返。传输对象把所有字段塞进一个对象,一次带回。下面的实验让你切换“逐个 getter”和“一个传输对象”,看远程调用次数的差异。
正在加载交互实验...
一个纯数据载体
java
// 传输对象:通常不可变,只有字段(和取值方法)
public record CustomerTO(String name, String email,
String phone, int vipLevel) {}
class CustomerService { // 业务层(可能在远端)
CustomerTO getCustomer(int id) {
// 一次调用,组装好所有字段一起返回
return new CustomerTO(...);
}
}关键特征:
- 传输对象不含业务逻辑,只是数据的容器。
- 通常做成不可变,便于安全地跨层传递。
- 它有意和领域实体分开——领域对象可以很复杂,DTO 只暴露这次传输需要的字段。
下面的对照器用滑块调整字段数量,量化“N 次往返”与“1 次传输”的延迟差距。
正在加载交互实验...
正在加载概念检查...
正在加载概念检查...
现实中的 DTO
DTO 是当今最常用的企业模式之一,几乎每个有 API 的系统都在用:
- API 的请求/响应体:REST/GraphQL 返回的 JSON 本质就是 DTO,刻意与数据库实体解耦,避免把内部结构暴露给外部。
- 层间边界:服务层返回 DTO 给表示层,防止领域模型的细节(和可变性)渗透到上层。
- 防腐层:DTO 让你能在不改动核心领域模型的前提下,调整对外暴露的数据结构。
理解传输对象,你就理解了为什么“数据库表结构”和“API 返回的 JSON”不应该、也不需要长得一模一样。
正在加载本节练习...