传输对象模式学习笔记

什么是传输对象模式?

传输对象模式(Transfer Object Pattern)是一种 Java 企业级模式,用于从客户端向服务器一次性传递带有多个属性的数据。传输对象也称为数值对象。传输对象是一个具有 getter/setter 方法的普通 Java 类,它是可序列化的,所以它可以通过网络传输。传输对象具有可变性,因此它可以传递到服务器并在那里更新,而且其状态仍然保持一致。

传输对象模式适用于以下场景:

  • 客户端需要传输大量数据给服务器端,并且数据格式简单。
  • 客户端需要只读访问来自服务器端的数据,而不需要更新数据。

传输对象模式的结构

传输对象模式由以下几个部分组成:

  • 传输对象(Transfer Object):数据传递对象。它是一个纯粹的 Java 对象,用于传输数据。在传输过程中,它可以被序列化,并且可以从客户端传递到服务器端或者反之。
  • 业务对象(Business Object):包含业务实体的类。由于使用传输对象而不是直接操作实体对象,业务对象可以被隔离在远程对象之后,从而保护了实体对象的安全性和可靠性。
  • 业务服务(Business Service):为客户端提供业务服务的类。此类可以调用 DAO 层获取数据并将其转换为传输对象,并向客户端返回一个传输对象。它还可以接受传输对象和将其转换为 DAO 层可以使用的实体对象。

实例

假设我们需要实现一个简单的学生课程管理系统。在这个系统中,我们将创建以下两个类:

  • StudentBO:业务对象类,包含学生的实体属性,例如姓名和年龄。
  • StudentVO:传输对象类,包含学生的基本信息,例如姓名和年龄。
javaCopy Code
// StudentBO.java public class StudentBO { // 学生列表 List<StudentVO> students; public StudentBO(){ students = new ArrayList<StudentVO>(); StudentVO student1 = new StudentVO("张三", 18); StudentVO student2 = new StudentVO("李四", 20); students.add(student1); students.add(student2); } public void deleteStudent(StudentVO student) { students.remove(student.getRollNo()); System.out.println("学生编号为 " + student.getRollNo() + ", 姓名为 " + student.getName() + " 的学生已被删除"); } // 从数据库中检索学生名单 public List<StudentVO> getAllStudents() { return students; } public StudentVO getStudent(int rollNo) { return students.get(rollNo); } public void updateStudent(StudentVO student) { students.get(student.getRollNo()).setName(student.getName()); System.out.println("学生编号为 " + student.getRollNo() + ", 姓名为 " + student.getName() + " 的学生已更新"); } }
javaCopy Code
// StudentVO.java public class StudentVO { private String name; private int rollNo; StudentVO(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; } }

对于客户端,我们将仅使用传输对象来访问业务对象中的数据。在这里,我们创建了一个 StudentBO 对象,该对象通过 StudentVO 对象向客户端返回数据。

javaCopy Code
// TransferObjectPatternDemo.java public class TransferObjectPatternDemo { public static void main(String[] args) { StudentBO studentBusinessObject = new StudentBO(); // 输出所有的学生 for (StudentVO student : studentBusinessObject.getAllStudents()) { System.out.println("学生编号为 " + student.getRollNo() + ", 姓名为 " + student.getName()); } // 更新学生 StudentVO student = studentBusinessObject.getAllStudents().get(0); student.setName("Michael"); studentBusinessObject.updateStudent(student); // 获取学生 student = studentBusinessObject.getStudent(0); System.out.println("学生编号为 " + student.getRollNo() + ", 姓名为 " + student.getName()); } }

运行结果:

Copy Code
学生编号为 0, 姓名为 张三 学生编号为 1, 姓名为 李四 学生编号为 0, 姓名为 Michael