Business Delegate
Propósito
El patrón Business Delegate añade una capa de abstracción entre los niveles de presentación y de negocio. Al utilizar
este patrón, conseguimos un acoplamiento flexible entre los niveles y encapsulamos el conocimiento sobre cómo localizar,
conectar e interactuar con los objetos de negocio que componen la aplicación.
También conocido como
Service Representative
Explicación
Ejemplo del mundo real
Una aplicación para teléfonos móviles promete transmitir a tu dispositivo cualquier película existente. Captura la
cadena de búsqueda del usuario y se la pasa al Delegado de Negocio. El Delegado de Negocio selecciona el
servicio de streaming de vídeo más adecuado y reproduce el vídeo.
En pocas palabras
Business Delegate añade una capa de abstracción entre los niveles de presentación y de negocio.
Wikipedia dice
Business Delegate es un patrón de diseño de Java EE. Este patrón está dirigido a reducir el acoplamiento entre los
servicios de negocio y el nivel de presentación conectado, y para ocultar los detalles de implementación de los
servicios (incluyendo la búsqueda y la accesibilidad de la arquitectura EJB). Los delegados de negocio actúan como un
adaptador para invocar objetos de negocio desde la capa de presentación.
Ejemplo programático
En primer lugar, tenemos una abstracción para los servicios de streaming de vídeo VideoStreamingService
y un par de
implementaciones NetflixService
y YouTubeService
.
public interface VideoStreamingService {
void doProcessing();
}
@Slf4j
public class NetflixService implements VideoStreamingService {
@Override
public void doProcessing() {
LOGGER.info("NetflixService is now processing");
}
}
@Slf4j
public class YouTubeService implements VideoStreamingService {
@Override
public void doProcessing() {
LOGGER.info("YouTubeService is now processing");
}
}
A continuación, tenemos un servicio de búsqueda BusinessLookup
que decide qué servicio de transmisión de vídeo
utilizar.
@Setter
public class BusinessLookup {
private NetflixService netflixService;
private YouTubeService youTubeService;
public VideoStreamingService getBusinessService(String movie) {
if (movie.toLowerCase(Locale.ROOT).contains("die hard")) {
return netflixService;
} else {
return youTubeService;
}
}
}
El Delegado de Negocio BusinessDelegate
utiliza una búsqueda de negocio para dirigir las solicitudes de reproducción
de películas a un servicio de streaming de vídeo adecuado.
@Setter
public class BusinessDelegate {
private BusinessLookup lookupService;
public void playbackMovie(String movie) {
VideoStreamingService videoStreamingService = lookupService.getBusinessService(movie);
videoStreamingService.doProcessing();
}
}
El cliente móvil MobileClient
utiliza Business Delegate para llamar al nivel de negocio.
public class MobileClient {
private final BusinessDelegate businessDelegate;
public MobileClient(BusinessDelegate businessDelegate) {
this.businessDelegate = businessDelegate;
}
public void playbackMovie(String movie) {
businessDelegate.playbackMovie(movie);
}
}
Por último, podemos demostrar el ejemplo completo en acción.
public static void main(String[]args){
// preparar los objetos
var businessDelegate=new BusinessDelegate();
var businessLookup=new BusinessLookup();
businessLookup.setNetflixService(new NetflixService());
businessLookup.setYouTubeService(new YouTubeService());
businessDelegate.setLookupService(businessLookup);
// crear el cliente y utilizar el Business Delegate
var client=new MobileClient(businessDelegate);
client.playbackMovie("Die Hard 2");
client.playbackMovie("Maradona: The Greatest Ever");
}
Aquí está la salida de la consola.
21:15:33.790 [main] INFO com.iluwatar.business.delegate.NetflixService - NetflixService is now processing
21:15:33.794 [main] INFO com.iluwatar.business.delegate.YouTubeService - YouTubeService is now processing
Diagrama de clases
Patrones relacionados
Aplicabilidad
Utilice el patrón Business Delegate cuando
- Desea un acoplamiento flexible entre los niveles de presentación y de negocio.
- Quieres orquestar llamadas a múltiples servicios de negocio
- Se desea encapsular las búsquedas y llamadas a servicios.
- Es necesario abstraer y encapsular la comunicación entre la capa cliente y los servicios de negocio.
Tutoriales
Usos conocidos
- Aplicaciones empresariales que utilicen Java EE (Java Platform, Enterprise Edition)
- Aplicaciones que requieren acceso remoto a servicios empresariales
Consecuencias
Ventajas:
- Desacoplamiento de los niveles de presentación y de negocio: Permite que el nivel de cliente y los servicios
empresariales evolucionen de forma independiente. - Transparencia de ubicación: Los clientes no se ven afectados por cambios en la ubicación o la instanciación de los
servicios de negocio. - Reutilización y escalabilidad: Los objetos Business Delegate pueden ser reutilizados por múltiples clientes, y el
patrón soporta el equilibrio de carga y la escalabilidad.
carga y escalabilidad.
Contrapartidas:
- Complejidad: Introduce capas y abstracciones adicionales que pueden aumentar la complejidad.
- Sobrecarga de rendimiento: La indirección adicional puede suponer una ligera penalización en el rendimiento.
Patrones relacionados
- Localizador de servicios: El Delegado de Negocio (
Business Delegate) utiliza el Localizador de Servicios (Service Locator) para localizar servicios de negocio. - Fachada de Sesión: El Delegado de Negocio (Business
Delegate) puede utilizar la Fachada de Sesión (Session Facade) para proporcionar una interfaz unificada a un conjunto
de servicios de negocio. - Entidad Compuesta: El Delegado (Business Delegate) de
Negocio puede utilizar Entidad Compuesta (Composite Entity) para gestionar el estado de los servicios de negocio.