自学教程 学编程从这里开始

传输对象模式

《传输对象模式》|J2EE企业架构模式

关键词:Transfer Object、DTO、数据传输对象、远程调用、批量数据传递
说明:传输对象模式不属于GOF23设计模式,属于J2EE企业架构模式

一、什么是传输对象模式

传输对象模式(Transfer Object Pattern):也叫DTO(Data Transfer Object)模式。用于远程调用场景,客户端和服务端之间通过一个简单POJO对象批量传输数据,减少远程调用次数。
传输对象只用来承载数据,不包含业务逻辑;服务端组装传输对象,一次性返回多条数据给客户端,避免多次远程方法调用。

核心意图
使用一个简单数据载体对象,批量封装数据进行跨层/远程传输,减少网络远程调用次数。

角色划分

  1. Client(客户端):远程调用方,向业务服务请求数据
  2. Business Object(业务对象BO):业务服务,处理业务逻辑,组装TransferObject
  3. Transfer Object(传输对象):纯数据载体,包含字段、get/set方法,无业务逻辑

数据流:
Client → BusinessObject → 组装TransferObject → 返回TransferObject → Client

二、UML结构图

角色划分:

  1. Client:发起请求
  2. BusinessObject:业务层,负责查询数据并封装成传输对象
  3. TransferObject:数据载体实体,仅保存数据

三、Java完整示例

模拟用户数据传输对象,代码全部使用英文。

// Transfer Object(DTO,仅承载数据)
public class StudentTO {
    private String name;
    private int rollNo;

    public StudentTO(String name, int rollNo) {
        this.name = name;
        this.rollNo = rollNo;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getRollNo() {
        return rollNo;
    }

    public void setRollNo(int rollNo) {
        this.rollNo = rollNo;
    }
}

// Business Object
public class StudentBO {
    // 模拟数据库
    public StudentTO getStudent() {
        // 查询数据,组装传输对象
        StudentTO studentTO = new StudentTO("Tom", 10001);
        return studentTO;
    }

    public void updateStudent(StudentTO studentTO){
        studentTO.setName("Tom Updated");
        System.out.println("Update student in DB, new name: " + studentTO.getName());
    }
}

// Client
public class Client {
    public static void main(String[] args) {
        StudentBO studentBO = new StudentBO();

        // 获取传输对象
        StudentTO studentTO = studentBO.getStudent();
        System.out.println("Student Name: " + studentTO.getName());
        System.out.println("Roll No: " + studentTO.getRollNo());

        // 修改传输对象,回传服务端更新
        studentTO.setName("Tom New");
        studentBO.updateStudent(studentTO);
    }
}

运行输出:

Student Name: Tom
Roll No: 10001
Update student in DB, new name: Tom Updated

四、传输对象模式 vs DAO模式

模式定位核心区别
传输对象模式J2EE架构模式,数据载体创建DTO对象,用于跨层/远程传输数据,减少远程调用
DAO模式J2EE架构模式,持久层封装封装数据库CRUD操作,隔离业务层与数据库

经常搭配使用:DAO读取数据库实体 → BO组装TransferObject → 返回给表现层。

五、优缺点总结

✅ 优点

  1. 一次远程调用传输多条字段数据,大幅减少远程方法调用次数
  2. 分离领域实体与对外传输数据,保护内部领域模型
  3. 按需组装返回字段,避免暴露数据库全部字段
  4. 序列化友好,适合网络传输

❌ 缺点

  1. 增加类文件,需要维护DTO;实体与DTO之间需要做对象转换
  2. 数据同步成本:数据库字段变更,DTO可能需要同步修改
  3. 容易出现DTO膨胀,一个DTO承载过多无关字段

六、框架应用场景

  • 早期J2EE EJB远程调用
  • SpringBoot接口开发,接口入参、出参DTO
  • RPC接口(Dubbo、gRPC)数据传输对象
  • RESTful API前后端数据交互

七、小结

传输对象模式核心:创建仅承载数据的传输对象,在远程或者跨层调用时批量传递数据,减少远程调用次数;传输对象不包含任何业务逻辑。

归属:J2EE架构模式,不属于GOF23;日常开发中DTO就是传输对象模式的典型实现。

标签:

0 条笔记