--- title: Business Delegate category: Structural language: es tag: - Decoupling --- ## 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`. ```java 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. ```java @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. ```java @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. ```java 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. ```java 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 ![Diagrama de clases](./etc/business-delegate.urm.png "Business Delegate") ## Patrones relacionados * [Patrón de localización de servicios](https://java-design-patterns.com/patterns/service-locator/) ## 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 * [Patrón Delegado de Negocio en TutorialsPoint](https://www.tutorialspoint.com/design_pattern/business_delegate_pattern.htm) ## 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](https://java-design-patterns.com/patterns/service-locator/): El Delegado de Negocio ( Business Delegate) utiliza el Localizador de Servicios (Service Locator) para localizar servicios de negocio. * [Fachada de Sesión](https://java-design-patterns.com/patterns/session-facade/): 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](https://java-design-patterns.com/patterns/composite-entity/): El Delegado (Business Delegate) de Negocio puede utilizar Entidad Compuesta (Composite Entity) para gestionar el estado de los servicios de negocio. ## Créditos * [J2EE Design Patterns](https://www.amazon.com/gp/product/0596004273/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596004273&linkCode=as2&tag=javadesignpat-20&linkId=48d37c67fb3d845b802fa9b619ad8f31) * [Core J2EE Patterns: Best Practices and Design Strategies](https://www.amazon.com/gp/product/0130648841/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=javadesignpat-20&creative=9325&linkCode=as2&creativeASIN=0130648841&linkId=a0100de2b28c71ede8db1757fb2b5947)