From e0f1376bd07a1c724eab7d455449ebe423b9af99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sat, 20 Mar 2021 21:37:53 +0200 Subject: [PATCH] #590 refactor and add explanation for business delegate --- business-delegate/README.md | 143 +++++++++++++++++- business-delegate/etc/business-delegate.png | Bin 24283 -> 0 bytes business-delegate/etc/business-delegate.ucls | 136 ----------------- .../etc/business-delegate.urm.png | Bin 0 -> 50060 bytes .../etc/business-delegate.urm.puml | 61 +++----- .../com/iluwatar/business/delegate/App.java | 22 ++- .../business/delegate/BusinessDelegate.java | 18 +-- .../business/delegate/BusinessLookup.java | 17 ++- .../{Client.java => MobileClient.java} | 10 +- .../{EjbService.java => NetflixService.java} | 6 +- .../business/delegate/ServiceType.java | 33 ---- ...ervice.java => VideoStreamingService.java} | 4 +- .../{JmsService.java => YouTubeService.java} | 6 +- .../delegate/BusinessDelegateTest.java | 47 +++--- 14 files changed, 220 insertions(+), 283 deletions(-) delete mode 100644 business-delegate/etc/business-delegate.png delete mode 100644 business-delegate/etc/business-delegate.ucls create mode 100644 business-delegate/etc/business-delegate.urm.png rename business-delegate/src/main/java/com/iluwatar/business/delegate/{Client.java => MobileClient.java} (84%) rename business-delegate/src/main/java/com/iluwatar/business/delegate/{EjbService.java => NetflixService.java} (89%) delete mode 100644 business-delegate/src/main/java/com/iluwatar/business/delegate/ServiceType.java rename business-delegate/src/main/java/com/iluwatar/business/delegate/{BusinessService.java => VideoStreamingService.java} (92%) rename business-delegate/src/main/java/com/iluwatar/business/delegate/{JmsService.java => YouTubeService.java} (89%) diff --git a/business-delegate/README.md b/business-delegate/README.md index b00c67819..886781632 100644 --- a/business-delegate/README.md +++ b/business-delegate/README.md @@ -9,21 +9,156 @@ tags: --- ## Intent + The Business Delegate pattern adds an abstraction layer between presentation and business tiers. By using the pattern we gain loose coupling between the tiers and encapsulate knowledge about how to locate, connect to, and interact with the business objects that make up the application. +## Explanation + +Real world example + +> A mobile phone application promises to stream any movie in existence to your phone. It captures +> the user's search string and passes this on to the business delegate. The business delegate +> selects the most suitable video streaming service and plays the video from there. + +In Plain Words + +> Business delegate adds an abstraction layer between the presentation and business tiers. + +Wikipedia says + +> Business delegate is a Java EE design pattern. This pattern is directing to reduce the coupling +> in between business services and the connected presentation tier, and to hide the implementation +> details of services (including lookup and accessibility of EJB architecture). Business delegates +> acts as an adaptor to invoke business objects from the presentation tier. + +**Programmatic Example** + +First, we have an abstraction for video streaming services and a couple of implementations. + +```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"); + } +} +``` + +Then we have a lookup service that decides which video streaming service is used. + +```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; + } + } +} +``` + +The business delegate uses a business lookup to route movie playback requests to a suitable +video streaming service. + +```java +@Setter +public class BusinessDelegate { + + private BusinessLookup lookupService; + + public void playbackMovie(String movie) { + VideoStreamingService videoStreamingService = lookupService.getBusinessService(movie); + videoStreamingService.doProcessing(); + } +} +``` + +The mobile client utilizes business delegate to call the business tier. + +```java +public class MobileClient { + + private final BusinessDelegate businessDelegate; + + public MobileClient(BusinessDelegate businessDelegate) { + this.businessDelegate = businessDelegate; + } + + public void playbackMovie(String movie) { + businessDelegate.playbackMovie(movie); + } +} +``` + +Finally, we can show the full example in action. + +```java + public static void main(String[] args) { + + // prepare the objects + var businessDelegate = new BusinessDelegate(); + var businessLookup = new BusinessLookup(); + businessLookup.setNetflixService(new NetflixService()); + businessLookup.setYouTubeService(new YouTubeService()); + businessDelegate.setLookupService(businessLookup); + + // create the client and use the business delegate + var client = new MobileClient(businessDelegate); + client.playbackMovie("Die Hard 2"); + client.playbackMovie("Maradona: The Greatest Ever"); + } +``` + +Here is the console output. + +``` +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 +``` + ## Class diagram -![alt text](./etc/business-delegate.png "Business Delegate") + +![alt text](./etc/business-delegate.urm.png "Business Delegate") + +## Related patterns + +* [Service locator pattern](https://java-design-patterns.com/patterns/service-locator/) ## Applicability + Use the Business Delegate pattern when -* you want loose coupling between presentation and business tiers -* you want to orchestrate calls to multiple business services -* you want to encapsulate service lookups and service calls +* You want loose coupling between presentation and business tiers +* You want to orchestrate calls to multiple business services +* You want to encapsulate service lookups and service calls + +## Tutorials + +* [Business Delegate Pattern at TutorialsPoint](https://www.tutorialspoint.com/design_pattern/business_delegate_pattern.htm) ## Credits * [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) diff --git a/business-delegate/etc/business-delegate.png b/business-delegate/etc/business-delegate.png deleted file mode 100644 index 928cf934645b8447540ddfb344c04220105b3db3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24283 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 diff --git a/business-delegate/etc/business-delegate.ucls b/business-delegate/etc/business-delegate.ucls deleted file mode 100644 index 668a6579e..000000000 --- a/business-delegate/etc/business-delegate.ucls +++ /dev/null @@ -1,136 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/business-delegate/etc/business-delegate.urm.png b/business-delegate/etc/business-delegate.urm.png new file mode 100644 index 0000000000000000000000000000000000000000..4dca6c263b99ddc3898218250c4da67fc6d71314 GIT binary patch literal 50060 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

X|h62V?2|OLQYYg$LNG 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 Y%N4F4Gn;|10UDZ&q=G~`Qpfdw0UUnbEC2ui literal 0 HcmV?d00001 diff --git a/business-delegate/etc/business-delegate.urm.puml b/business-delegate/etc/business-delegate.urm.puml index 40aa2d6f0..407e3e12d 100644 --- a/business-delegate/etc/business-delegate.urm.puml +++ b/business-delegate/etc/business-delegate.urm.puml @@ -5,53 +5,42 @@ package com.iluwatar.business.delegate { + main(args : String[]) {static} } class BusinessDelegate { - - businessService : BusinessService - lookupService : BusinessLookup - - serviceType : ServiceType + BusinessDelegate() - + doTask() - + setLookupService(businessLookup : BusinessLookup) - + setServiceType(serviceType : ServiceType) + + playbackMovie(movie : String) + + setLookupService(lookupService : BusinessLookup) } class BusinessLookup { - - ejbService : EjbService - - jmsService : JmsService + - netflixService : NetflixService + - youTubeService : YouTubeService + BusinessLookup() - + getBusinessService(serviceType : ServiceType) : BusinessService - + setEjbService(ejbService : EjbService) - + setJmsService(jmsService : JmsService) + + getBusinessService(movie : String) : VideoStreamingService + + setNetflixService(netflixService : NetflixService) + + setYouTubeService(youTubeService : YouTubeService) } - interface BusinessService { + class MobileClient { + - businessDelegate : BusinessDelegate + + MobileClient(businessDelegate : BusinessDelegate) + + playbackMovie(movie : String) + } + class NetflixService { + - LOGGER : Logger {static} + + NetflixService() + + doProcessing() + } + interface VideoStreamingService { + doProcessing() {abstract} } - class Client { - - businessDelegate : BusinessDelegate - + Client(businessDelegate : BusinessDelegate) - + doTask() - } - class EjbService { + class YouTubeService { - LOGGER : Logger {static} - + EjbService() + + YouTubeService() + doProcessing() } - class JmsService { - - LOGGER : Logger {static} - + JmsService() - + doProcessing() - } - enum ServiceType { - + EJB {static} - + JMS {static} - + valueOf(name : String) : ServiceType {static} - + values() : ServiceType[] {static} - } } -BusinessLookup --> "-ejbService" EjbService -BusinessDelegate --> "-serviceType" ServiceType -Client --> "-businessDelegate" BusinessDelegate -BusinessDelegate --> "-businessService" BusinessService +BusinessLookup --> "-netflixService" NetflixService +BusinessLookup --> "-youTubeService" YouTubeService +MobileClient --> "-businessDelegate" BusinessDelegate BusinessDelegate --> "-lookupService" BusinessLookup -BusinessLookup --> "-jmsService" JmsService -EjbService ..|> BusinessService -JmsService ..|> BusinessService +NetflixService ..|> VideoStreamingService +YouTubeService ..|> VideoStreamingService @enduml \ No newline at end of file diff --git a/business-delegate/src/main/java/com/iluwatar/business/delegate/App.java b/business-delegate/src/main/java/com/iluwatar/business/delegate/App.java index 8bd4d12c6..e87ca9c64 100644 --- a/business-delegate/src/main/java/com/iluwatar/business/delegate/App.java +++ b/business-delegate/src/main/java/com/iluwatar/business/delegate/App.java @@ -33,9 +33,9 @@ package com.iluwatar.business.delegate; * retrieved through service lookups. The Business Delegate itself may contain business logic too * potentially tying together multiple service calls, exception handling, retrying etc. * - *

In this example the client ({@link Client}) utilizes a business delegate ( - * {@link BusinessDelegate}) to execute a task. The Business Delegate then selects the appropriate - * service and makes the service call. + *

In this example the client ({@link MobileClient}) utilizes a business delegate ( + * {@link BusinessDelegate}) to search for movies in video streaming services. The Business Delegate + * then selects the appropriate service and makes the service call. */ public class App { @@ -46,18 +46,16 @@ public class App { */ public static void main(String[] args) { + // prepare the objects var businessDelegate = new BusinessDelegate(); var businessLookup = new BusinessLookup(); - businessLookup.setEjbService(new EjbService()); - businessLookup.setJmsService(new JmsService()); - + businessLookup.setNetflixService(new NetflixService()); + businessLookup.setYouTubeService(new YouTubeService()); businessDelegate.setLookupService(businessLookup); - businessDelegate.setServiceType(ServiceType.EJB); - var client = new Client(businessDelegate); - client.doTask(); - - businessDelegate.setServiceType(ServiceType.JMS); - client.doTask(); + // create the client and use the business delegate + var client = new MobileClient(businessDelegate); + client.playbackMovie("Die Hard 2"); + client.playbackMovie("Maradona: The Greatest Ever"); } } diff --git a/business-delegate/src/main/java/com/iluwatar/business/delegate/BusinessDelegate.java b/business-delegate/src/main/java/com/iluwatar/business/delegate/BusinessDelegate.java index d1255bf5f..6246145e7 100644 --- a/business-delegate/src/main/java/com/iluwatar/business/delegate/BusinessDelegate.java +++ b/business-delegate/src/main/java/com/iluwatar/business/delegate/BusinessDelegate.java @@ -23,24 +23,18 @@ package com.iluwatar.business.delegate; +import lombok.Setter; + /** * BusinessDelegate separates the presentation and business tiers. */ +@Setter public class BusinessDelegate { private BusinessLookup lookupService; - private ServiceType serviceType; - public void setLookupService(BusinessLookup businessLookup) { - this.lookupService = businessLookup; - } - - public void setServiceType(ServiceType serviceType) { - this.serviceType = serviceType; - } - - public void doTask() { - BusinessService businessService = lookupService.getBusinessService(serviceType); - businessService.doProcessing(); + public void playbackMovie(String movie) { + VideoStreamingService videoStreamingService = lookupService.getBusinessService(movie); + videoStreamingService.doProcessing(); } } diff --git a/business-delegate/src/main/java/com/iluwatar/business/delegate/BusinessLookup.java b/business-delegate/src/main/java/com/iluwatar/business/delegate/BusinessLookup.java index 07ad6342e..0369c04e8 100644 --- a/business-delegate/src/main/java/com/iluwatar/business/delegate/BusinessLookup.java +++ b/business-delegate/src/main/java/com/iluwatar/business/delegate/BusinessLookup.java @@ -23,6 +23,7 @@ package com.iluwatar.business.delegate; +import java.util.Locale; import lombok.Setter; /** @@ -31,21 +32,21 @@ import lombok.Setter; @Setter public class BusinessLookup { - private EjbService ejbService; + private NetflixService netflixService; - private JmsService jmsService; + private YouTubeService youTubeService; /** - * Gets service instance based on service type. + * Gets service instance based on given movie search string. * - * @param serviceType Type of service instance to be returned. + * @param movie Search string for the movie. * @return Service instance. */ - public BusinessService getBusinessService(ServiceType serviceType) { - if (serviceType.equals(ServiceType.EJB)) { - return ejbService; + public VideoStreamingService getBusinessService(String movie) { + if (movie.toLowerCase(Locale.ROOT).contains("die hard")) { + return netflixService; } else { - return jmsService; + return youTubeService; } } } diff --git a/business-delegate/src/main/java/com/iluwatar/business/delegate/Client.java b/business-delegate/src/main/java/com/iluwatar/business/delegate/MobileClient.java similarity index 84% rename from business-delegate/src/main/java/com/iluwatar/business/delegate/Client.java rename to business-delegate/src/main/java/com/iluwatar/business/delegate/MobileClient.java index 4d5c151e3..2cfb6f344 100644 --- a/business-delegate/src/main/java/com/iluwatar/business/delegate/Client.java +++ b/business-delegate/src/main/java/com/iluwatar/business/delegate/MobileClient.java @@ -24,17 +24,17 @@ package com.iluwatar.business.delegate; /** - * Client utilizes BusinessDelegate to call the business tier. + * MobileClient utilizes BusinessDelegate to call the business tier. */ -public class Client { +public class MobileClient { private final BusinessDelegate businessDelegate; - public Client(BusinessDelegate businessDelegate) { + public MobileClient(BusinessDelegate businessDelegate) { this.businessDelegate = businessDelegate; } - public void doTask() { - businessDelegate.doTask(); + public void playbackMovie(String movie) { + businessDelegate.playbackMovie(movie); } } diff --git a/business-delegate/src/main/java/com/iluwatar/business/delegate/EjbService.java b/business-delegate/src/main/java/com/iluwatar/business/delegate/NetflixService.java similarity index 89% rename from business-delegate/src/main/java/com/iluwatar/business/delegate/EjbService.java rename to business-delegate/src/main/java/com/iluwatar/business/delegate/NetflixService.java index 6813dfec1..ae9da8747 100644 --- a/business-delegate/src/main/java/com/iluwatar/business/delegate/EjbService.java +++ b/business-delegate/src/main/java/com/iluwatar/business/delegate/NetflixService.java @@ -26,13 +26,13 @@ package com.iluwatar.business.delegate; import lombok.extern.slf4j.Slf4j; /** - * Service EJB implementation. + * NetflixService implementation. */ @Slf4j -public class EjbService implements BusinessService { +public class NetflixService implements VideoStreamingService { @Override public void doProcessing() { - LOGGER.info("EjbService is now processing"); + LOGGER.info("NetflixService is now processing"); } } diff --git a/business-delegate/src/main/java/com/iluwatar/business/delegate/ServiceType.java b/business-delegate/src/main/java/com/iluwatar/business/delegate/ServiceType.java deleted file mode 100644 index 503f30797..000000000 --- a/business-delegate/src/main/java/com/iluwatar/business/delegate/ServiceType.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * The MIT License - * Copyright © 2014-2021 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -package com.iluwatar.business.delegate; - -/** - * Enumeration for service types. - */ -public enum ServiceType { - - EJB, - JMS -} diff --git a/business-delegate/src/main/java/com/iluwatar/business/delegate/BusinessService.java b/business-delegate/src/main/java/com/iluwatar/business/delegate/VideoStreamingService.java similarity index 92% rename from business-delegate/src/main/java/com/iluwatar/business/delegate/BusinessService.java rename to business-delegate/src/main/java/com/iluwatar/business/delegate/VideoStreamingService.java index 20845841f..3c8b7e3fb 100644 --- a/business-delegate/src/main/java/com/iluwatar/business/delegate/BusinessService.java +++ b/business-delegate/src/main/java/com/iluwatar/business/delegate/VideoStreamingService.java @@ -24,9 +24,9 @@ package com.iluwatar.business.delegate; /** - * Interface for service implementations. + * Interface for video streaming service implementations. */ -public interface BusinessService { +public interface VideoStreamingService { void doProcessing(); } diff --git a/business-delegate/src/main/java/com/iluwatar/business/delegate/JmsService.java b/business-delegate/src/main/java/com/iluwatar/business/delegate/YouTubeService.java similarity index 89% rename from business-delegate/src/main/java/com/iluwatar/business/delegate/JmsService.java rename to business-delegate/src/main/java/com/iluwatar/business/delegate/YouTubeService.java index 932c5038d..aa79e7309 100644 --- a/business-delegate/src/main/java/com/iluwatar/business/delegate/JmsService.java +++ b/business-delegate/src/main/java/com/iluwatar/business/delegate/YouTubeService.java @@ -26,13 +26,13 @@ package com.iluwatar.business.delegate; import lombok.extern.slf4j.Slf4j; /** - * Service JMS implementation. + * YouTubeService implementation. */ @Slf4j -public class JmsService implements BusinessService { +public class YouTubeService implements VideoStreamingService { @Override public void doProcessing() { - LOGGER.info("JmsService is now processing"); + LOGGER.info("YouTubeService is now processing"); } } diff --git a/business-delegate/src/test/java/com/iluwatar/business/delegate/BusinessDelegateTest.java b/business-delegate/src/test/java/com/iluwatar/business/delegate/BusinessDelegateTest.java index b59759328..8cd5e2021 100644 --- a/business-delegate/src/test/java/com/iluwatar/business/delegate/BusinessDelegateTest.java +++ b/business-delegate/src/test/java/com/iluwatar/business/delegate/BusinessDelegateTest.java @@ -26,25 +26,20 @@ package com.iluwatar.business.delegate; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; + +import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; /** - * The Business Delegate pattern adds an abstraction layer between the presentation and business - * tiers. By using the pattern we gain loose coupling between the tiers. The Business Delegate - * encapsulates knowledge about how to locate, connect to, and interact with the business objects - * that make up the application. - * - *

Some of the services the Business Delegate uses are instantiated directly, and some can be - * retrieved through service lookups. The Business Delegate itself may contain business logic too - * potentially tying together multiple service calls, exception handling, retrying etc. + * Tests for the {@link BusinessDelegate} */ class BusinessDelegateTest { - private EjbService ejbService; + private NetflixService netflixService; - private JmsService jmsService; + private YouTubeService youTubeService; private BusinessDelegate businessDelegate; @@ -54,19 +49,19 @@ class BusinessDelegateTest { */ @BeforeEach public void setup() { - ejbService = spy(new EjbService()); - jmsService = spy(new JmsService()); + netflixService = spy(new NetflixService()); + youTubeService = spy(new YouTubeService()); BusinessLookup businessLookup = spy(new BusinessLookup()); - businessLookup.setEjbService(ejbService); - businessLookup.setJmsService(jmsService); + businessLookup.setNetflixService(netflixService); + businessLookup.setYouTubeService(youTubeService); businessDelegate = spy(new BusinessDelegate()); businessDelegate.setLookupService(businessLookup); } /** - * In this example the client ({@link Client}) utilizes a business delegate ( + * In this example the client ({@link MobileClient}) utilizes a business delegate ( * {@link BusinessDelegate}) to execute a task. The Business Delegate then selects the appropriate * service and makes the service call. */ @@ -74,26 +69,20 @@ class BusinessDelegateTest { void testBusinessDelegate() { // setup a client object - var client = new Client(businessDelegate); - - // set the service type - businessDelegate.setServiceType(ServiceType.EJB); + var client = new MobileClient(businessDelegate); // action - client.doTask(); + client.playbackMovie("Die hard"); - // verifying that the businessDelegate was used by client during doTask() method. - verify(businessDelegate).doTask(); - verify(ejbService).doProcessing(); - - // set the service type - businessDelegate.setServiceType(ServiceType.JMS); + // verifying that the businessDelegate was used by client during playbackMovie() method. + verify(businessDelegate).playbackMovie(anyString()); + verify(netflixService).doProcessing(); // action - client.doTask(); + client.playbackMovie("Maradona"); // verifying that the businessDelegate was used by client during doTask() method. - verify(businessDelegate, times(2)).doTask(); - verify(jmsService).doProcessing(); + verify(businessDelegate, times(2)).playbackMovie(anyString()); + verify(youTubeService).doProcessing(); } }