Patrón de Objeto de Transferencia

El patrón de objeto de transferencia (Transfer Object Pattern) se utiliza para transferir datos con múltiples atributos desde el cliente al servidor de una sola vez. El objeto de transferencia también se conoce como objeto de valor. El objeto de transferencia es una clase POJO simple con métodos getter/setter; es serializable, por lo que puede transmitirse a través de la red. No tiene ningún comportamiento. Las clases de negocio del lado del servidor generalmente leen datos de la base de datos, luego completan el POJO y lo envían al cliente o lo pasan por valor. Para el cliente, el objeto de transferencia es de solo lectura. El cliente puede crear su propio objeto de transferencia y pasarlo al servidor para actualizar los valores de la base de datos de una sola vez. A continuación se presentan las entidades de este patrón de diseño.

  • Objeto de negocio (Business Object)- Servicio de negocio que completa los datos para el objeto de transferencia.
  • Objeto de transferencia (Transfer Object)- POJO simple, solo con métodos para establecer/obtener propiedades.
  • Cliente (Client)- El cliente puede enviar solicitudes o enviar el objeto de transferencia al objeto de negocio.

Resumen

Intención

Se utiliza para simplificar la transferencia de datos entre la red o las capas de la aplicación. Encapsula los datos creando una clase con múltiples atributos que representan los datos que deben transferirse.

Problemas principales que resuelve

  • Resuelve los problemas de eficiencia y encapsulamiento al transferir datos entre capas en sistemas distribuidos, especialmente en aplicaciones de múltiples capas.

Escenarios de uso

  • Cuando se necesita transferir grandes cantidades de datos entre el cliente y el servidor, especialmente en servicios web o llamadas a procedimientos remotos (RPC).

Método de implementación

  • Clase de objeto de transferencia: define una clase con múltiples atributos que representan los datos que deben transferirse.
  • Capa de acceso a datos: se encarga de extraer datos de la base de datos u otras fuentes de datos y completarlos en el objeto de transferencia.
  • Capa de lógica de negocio: opcional, maneja la lógica de negocio y puede necesitar usar el objeto de transferencia.
  • Capa de presentación o cliente: utiliza el objeto de transferencia para mostrar datos o como portador de datos de entrada del usuario.

Código clave

  • Clase de objeto de transferencia: contiene atributos y posible lógica de negocio, para el encapsulamiento y la transferencia de datos.

Ejemplos de aplicación

  • Aplicación web: la capa de presentación obtiene o envía datos desde/hacia el servidor mediante el objeto de transferencia.

Ventajas

  1. Reducir la sobrecarga de comunicación de red: al transferir múltiples datos de una sola vez, se reduce el número de solicitudes de red.
  2. Encapsulamiento: el objeto de transferencia actúa como un portador de encapsulamiento de datos y oculta la estructura interna de los datos.
  3. Fácil de mantener: gestiona centralizadamente los datos de transferencia, lo que facilita la modificación y la ampliación.

Desventajas

  • Uso excesivo: puede aumentar la complejidad del sistema debido a la creación de demasiados objetos de transferencia.

Recomendaciones de uso

  • Cuando sea necesario transferir grandes cantidades de datos entre diferentes capas de una aplicación de múltiples capas, considere usar el patrón de objeto de transferencia.

Precauciones

  • El objeto de transferencia debe mantenerse ligero y evitar incluir demasiada lógica de negocio.

Principales roles involucrados

  1. Clase de objeto de transferencia (Transfer Object Class):

    • Encapsula los datos que deben transferirse.
  2. Capa de acceso a datos (Data Access Layer):

    • Proporciona los datos y puede ser responsable de completarlos en el objeto de transferencia.
  3. Capa de lógica de negocio (Business Logic Layer) (opcional):

    • Opcional, maneja la lógica de negocio y puede usar el objeto de transferencia.
  4. Capa de presentación o cliente (Presentation Layer or Client):

    • Usa el objeto de transferencia para mostrar datos o enviar solicitudes.

El patrón de objeto de transferencia, al encapsular los datos de transferencia en un objeto, ofrece una forma eficaz de reducir el número de comunicaciones de red y simplificar el proceso de transferencia de datos.


Implementación

Crearemos uno que actúe como objeto de negocioStudentBOy uno que actúe como objeto de transferenciaStudentVO, que representan nuestras entidades.

TransferObjectPatternDemoLa clase aquí actúa como un cliente y utilizaráStudentBOyStudentpara demostrar el patrón de diseño de objeto de transferencia.

传输对象模式的 UML 图

Paso 1

Crear el objeto de transferencia.

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

Paso 2

Crear el objeto de negocio.

StudentBO.java

import java.util.ArrayList; import java.util.List; public class StudentBO { //La lista se utiliza como una base de datos 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"); } //Recuperar la lista de estudiantes de la base de datos 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"); } }

Paso 3

UsarStudentBOpara demostrar el patrón de diseño de objeto de transferencia.

TransferObjectPatternDemo.java

public class TransferObjectPatternDemo { public static void main(String[] args) { StudentBO studentBusinessObject = new StudentBO(); //Mostrar todos los estudiantes for (StudentVO student : studentBusinessObject.getAllStudents()) { System.out.println("Student: [RollNo : " +student.getRollNo()+", Name : "+student.getName()+" ]"); } //Actualizar estudiante StudentVO student =studentBusinessObject.getAllStudents().get(0); student.setName("Michael"); studentBusinessObject.updateStudent(student); //Obtener estudiante studentBusinessObject.getStudent(0); System.out.println("Student: [RollNo : " +student.getRollNo()+", Name : "+student.getName()+" ]"); } }

Paso 4

Ejecutar el programa y mostrar el resultado:

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