Design Pattern - Modello di localizzazione del servizio

Il modello di progettazione del localizzatore di servizi viene utilizzato quando si desidera individuare vari servizi utilizzando la ricerca JNDI. Considerando l'elevato costo di ricerca di JNDI per un servizio, il pattern Service Locator utilizza la tecnica di memorizzazione nella cache. Per la prima volta che è richiesto un servizio, Service Locator cerca in JNDI e memorizza nella cache l'oggetto servizio. Un'ulteriore ricerca o lo stesso servizio tramite Service Locator viene eseguita nella sua cache, il che migliora notevolmente le prestazioni dell'applicazione. Di seguito sono riportate le entità di questo tipo di design pattern.

  • Service- Servizio effettivo che elaborerà la richiesta. Il riferimento a tale servizio deve essere esaminato nel server JNDI.

  • Context / Initial Context - Il contesto JNDI contiene il riferimento al servizio utilizzato a scopo di ricerca.

  • Service Locator - Service Locator è un unico punto di contatto per ottenere servizi tramite ricerca JNDI memorizzando nella cache i servizi.

  • Cache - Cache per memorizzare i riferimenti dei servizi per riutilizzarli

  • Client - Client è l'oggetto che richiama i servizi tramite ServiceLocator.

Implementazione

Creeremo un ServiceLocator , InitialContext , Cache , Service come vari oggetti che rappresentano le nostre entità. Service1 e Service2 rappresentano servizi concreti.

ServiceLocatorPatternDemo , la nostra classe demo, funge da client qui e utilizzerà ServiceLocator per dimostrare Service Locator Design Pattern.

Passo 1

Crea interfaccia di servizio.

Service.java

public interface Service {
   public String getName();
   public void execute();
}

Passo 2

Crea servizi concreti.

Service1.java

public class Service1 implements Service {
   public void execute(){
      System.out.println("Executing Service1");
   }

   @Override
   public String getName() {
      return "Service1";
   }
}

Service2.java

public class Service2 implements Service {
   public void execute(){
      System.out.println("Executing Service2");
   }

   @Override
   public String getName() {
      return "Service2";
   }
}

Passaggio 3

Crea InitialContext per la ricerca JNDI

InitialContext.java

public class InitialContext {
   public Object lookup(String jndiName){
   
      if(jndiName.equalsIgnoreCase("SERVICE1")){
         System.out.println("Looking up and creating a new Service1 object");
         return new Service1();
      }
      else if (jndiName.equalsIgnoreCase("SERVICE2")){
         System.out.println("Looking up and creating a new Service2 object");
         return new Service2();
      }
      return null;		
   }
}

Passaggio 4

Crea cache

Cache.java

import java.util.ArrayList;
import java.util.List;

public class Cache {

   private List<Service> services;

   public Cache(){
      services = new ArrayList<Service>();
   }

   public Service getService(String serviceName){
   
      for (Service service : services) {
         if(service.getName().equalsIgnoreCase(serviceName)){
            System.out.println("Returning cached  " + serviceName + " object");
            return service;
         }
      }
      return null;
   }

   public void addService(Service newService){
      boolean exists = false;
      
      for (Service service : services) {
         if(service.getName().equalsIgnoreCase(newService.getName())){
            exists = true;
         }
      }
      if(!exists){
         services.add(newService);
      }
   }
}

Passaggio 5

Crea localizzatore di servizi

ServiceLocator.java

public class ServiceLocator {
   private static Cache cache;

   static {
      cache = new Cache();		
   }

   public static Service getService(String jndiName){

      Service service = cache.getService(jndiName);

      if(service != null){
         return service;
      }

      InitialContext context = new InitialContext();
      Service service1 = (Service)context.lookup(jndiName);
      cache.addService(service1);
      return service1;
   }
}

Passaggio 6

Utilizzare ServiceLocator per dimostrare il modello di progettazione di Service Locator.

ServiceLocatorPatternDemo.java

public class ServiceLocatorPatternDemo {
   public static void main(String[] args) {
      Service service = ServiceLocator.getService("Service1");
      service.execute();
      service = ServiceLocator.getService("Service2");
      service.execute();
      service = ServiceLocator.getService("Service1");
      service.execute();
      service = ServiceLocator.getService("Service2");
      service.execute();		
   }
}

Passaggio 7

Verifica l'output.

Looking up and creating a new Service1 object
Executing Service1
Looking up and creating a new Service2 object
Executing Service2
Returning cached  Service1 object
Executing Service1
Returning cached  Service2 object
Executing Service2