Design Pattern 简明教程

Design Pattern - Transfer Object Pattern

当我们想一次用多个属性从客户端传输数据到服务器时,使用传输对象模式。传输对象也称为值对象。传输对象是一个简单的 POJO 类,具有 getter/setter 方法,并且可序列化,以便可以在网络上进行传输。它没有任何行为。服务器端业务类通常从数据库获取数据并填充 POJO 并将其发送到客户端或按值传递。对于客户端,传输对象是只读的。客户端可以创建自己的传输对象并将其传递给服务器以一次更新数据库中的值。以下是这种设计模式的实体。

The Transfer Object pattern is used when we want to pass data with multiple attributes in one shot from client to server. Transfer object is also known as Value Object. Transfer Object is a simple POJO class having getter/setter methods and is serializable so that it can be transferred over the network. It does not have any behavior. Server Side business class normally fetches data from the database and fills the POJO and send it to the client or pass it by value. For client, transfer object is read-only. Client can create its own transfer object and pass it to server to update values in database in one shot. Following are the entities of this type of design pattern.

  1. Business Object - Business Service fills the Transfer Object with data.

  2. Transfer Object - Simple POJO having methods to set/get attributes only.

  3. Client - Client either requests or sends the Transfer Object to Business Object.

Implementation

我们将创建一个 StudentBO 作为业务对象,Student 作为传输对象来表示我们的实体。

We are going to create a StudentBO as Business Object,Student as Transfer Object representing our entities.

TransferObjectPatternDemo,我们的演示类,在此充当客户端,并将使用 StudentBO 和 Student 来演示传输对象设计模式。

TransferObjectPatternDemo, our demo class, is acting as a client here and will use StudentBO and Student to demonstrate Transfer Object Design Pattern.

transferobject pattern uml diagram

Step 1

创建传输对象。

Create Transfer Object.

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;
   }
}

Step 2

创建业务对象。

Create Business Object.

StudentBO.java

import java.util.ArrayList;
import java.util.List;

public class StudentBO {

   //list is working as a database
   List<StudentVO> students;

   public StudentBO(){
      students = new ArrayList<StudentVO>();
      StudentVO student1 = new StudentVO("Robert",0);
      StudentVO student2 = new StudentVO("John",1);
      students.add(student1);
      students.add(student2);
   }
   public void deleteStudent(StudentVO student) {
      students.remove(student.getRollNo());
      System.out.println("Student: Roll No " + student.getRollNo() + ", deleted from database");
   }

   //retrive list of students from the database
   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: Roll No " + student.getRollNo() +", updated in the database");
   }
}

Step 3

使用 StudentBO 来演示传输对象设计模式。

Use the StudentBO to demonstrate Transfer Object Design Pattern.

TransferObjectPatternDemo.java

public class TransferObjectPatternDemo {
   public static void main(String[] args) {
      StudentBO studentBusinessObject = new StudentBO();

      //print all students
      for (StudentVO student : studentBusinessObject.getAllStudents()) {
         System.out.println("Student: [RollNo : " + student.getRollNo() + ", Name : " + student.getName() + " ]");
      }

      //update student
      StudentVO student = studentBusinessObject.getAllStudents().get(0);
      student.setName("Michael");
      studentBusinessObject.updateStudent(student);

      //get the student
      student = studentBusinessObject.getStudent(0);
      System.out.println("Student: [RollNo : " + student.getRollNo() + ", Name : " + student.getName() + " ]");
   }
}

Step 4

验证输出。

Verify the output.

Student: [RollNo : 0, Name : Robert ]
Student: [RollNo : 1, Name : John ]
Student: Roll No 0, updated in the database
Student: [RollNo : 0, Name : Michael ]