Transfer Object

RECU-0150 (Recurso Patrón)

Descripción

Este patrón permite el intercambio de datos eficiente entre las capas cliente y EJB.

Contexto

Las aplicaciones cliente necesitan intercambiar datos con Beans Enterprise.

Problema

Las aplicaciones de la plataforma J2EE implementan componentes de negocio del lado del servidor como beans de sesión y de entidad. Algunos métodos expuestos por los componentes de negocio devuelven datos al cliente. Algunas veces, el cliente invoca a los métodos get de un objeto de negocio varias veces para obtener todos los valores de los atributos.

Los beans de sesión representan los servicios de negocio y no se comparten entre usuarios. Un bean de sesión proporciona métodos de servicios genéricos cuando se implementan para el patrón Session Facade.

Por otro lado, los beans de entidad son objetos transaccionales multiusuario que representan datos persistentes. Un bean de entidad expone los valores de los atributos proporcionando un método accesor (también referidos como métodos get) por cada atributo que desea exponer.

Toda llamada a método hecha al objeto de servicio de negocio, ya sea a un bean de entidad o a un bean de sesión, potencialmente es una llamada remota. Así, en una aplicación de JavaBeans Enterprise (EJB) dichas llamadas remotas usan la capa de red sin importar la proximidad del cliente al bean, creando una sobrecarga en la red. Las llamadas a métodos de beans enterprise podría penetrar las capas de red incluso si tanto el cliente como el contenedor EJB que mantiene el bean de entidad se están ejecutando en la misma JVM (Máquina Virtual Java), el mismo Sistema Operativo o máquina física.

Según se incrementa la utilización de estos métodos remotos, el rendimiento de la aplicación se puede degradar significativamente. Por lo tanto, utilizar varias llamadas a métodos get que devuelven simples valores de atributos es ineficiente para obtener valores de datos desde un bean enterprise.

Solución

Utilizar un Transfer Object para encapsular los datos de negocio. Se utiliza una única llamada a un método para envíar y recuperar el Transfer Object. Cuando el cliente solicita los datos de negocio al bean enterprise, éste puede construir el Transfer Object, rellenarlo con sus valores de atributos y pasarlo por valor al cliente.

Los clientes normalmente solicitan más de un valor a un bean enterprise. Para reducir el número de llamadas remotas y evitar la sobrecarga asociada, es mejor el Transfer Object para transportar los datos desde el bean enteprise al cliente.

Cuando un bean enterprise utiliza un Transfer Object, el cliente hace una sola llamada a un método remoto del bean enterprise para solicitar el Transfer Object en vez de numerosas llamadas remotas para obtener valores de atributos individuales. Entonces el bean enterprise construye un nuevo ejemplar Transfer Object, copia dentro los valores del objeto y lo devuelve al cliente. El cliente recibe el Transfer Object y puede entonces invocar los métodos accesores (o get) del Transfer Object para obtener los valores de atributos individuales del objeto Transfer Object. O, la implementación del Transfer Object podría hacer que todos los atributos fueran públicos. Como el Transfer Object se pasa por valor al cliente, todas las llamadas al ejemplar Transfer Object son llamadas locales en vez de invocaciones de métodos remotos.

Implementación y Participantes

El diagrama de secuencia del patrón es el siguiente:

  • Cliente: Representa al cliente del bean enterprise. El Cliente puede ser una aplicación final de usuario, como es el caso de una aplicación que ha sido diseñada para acceder directamente a beans enterprise. El Cliente puede utilizar Business Delegate u otro BusinessObject diferente.
  • BusinessObject: Representa un rol en este patrón que puede cumplir un bean de sesión, un bean de entidad, o un Data Access Object (DAO). BusinessObject es el responsable de crear el TransferObject y devolverlo al cliente bajo pedido. El BusinessObject también podría recibir datos desde el cliente en la forma de un TransferObject y utilizar esos datos para realizar una actualización.
  • TransferObject: Es un objeto Java serializable referenciado como un TransferObject. Una clase TransferObject podría proporcionar un constructor que acepte todos los atributos requeridos para crear el TransferObject. El constructor podría aceptar todos los valores de atributos del bean de entidad para el que se ha diseñado el TransferObject. Normalmente, los miembros del TransferObject se definen como públicos, así eliminan la necesidad de los métodos get y set. Si se necesita alguna protección, los miembros podrían definirse como protected o private, y se definirían métodos get para sus valores. Si no ofrece métodos set para los valores, un TransferObject está protegido frente a modificaciones después de su creación. Si sólo se permite la modificación de unos pocos miembros para facilitar las actualizaciones, entonces si que se de deben proporcionar métodos set. Por lo tanto, la creación del TransferObject varía dependiendo de los requerimientos de la aplicación.

Clasificación

Otros

Enlaces externos

Contenidos relacionados

Pautas
Área: Desarrollo » Patrones de Diseño » Capa de negocio
Código Título Tipo Carácter
LIBP-0347 Uso de Patrones J2EE de la Capa de Negocio Libro de pautas Directriz Recomendada
Recursos
Área: Desarrollo » Patrones de Diseño
Código Título Tipo Carácter
RECU-0013 Patrones de diseño Ficha Recomendado