传输对象模式学习笔记
什么是传输对象模式?
传输对象模式(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