Modèle de conception - Modèle de localisateur de service

Le modèle de conception de localisateur de services est utilisé lorsque nous voulons localiser divers services à l'aide de la recherche JNDI. Compte tenu du coût élevé de recherche de JNDI pour un service, le modèle de localisateur de service utilise la technique de mise en cache. Pour la première fois qu'un service est requis, Service Locator recherche dans JNDI et met en cache l'objet de service. Une recherche supplémentaire ou le même service via Service Locator est effectué dans son cache, ce qui améliore considérablement les performances de l'application. Voici les entités de ce type de modèle de conception.

  • Service- Service réel qui traitera la demande. La référence d'un tel service doit être examinée dans le serveur JNDI.

  • Context / Initial Context - Le contexte JNDI porte la référence au service utilisé à des fins de recherche.

  • Service Locator - Service Locator est un point de contact unique pour obtenir des services par recherche JNDI mettant en cache les services.

  • Cache - Cache pour stocker les références des services pour les réutiliser

  • Client - Le client est l'objet qui appelle les services via ServiceLocator.

la mise en oeuvre

Nous allons créer un ServiceLocator , InitialContext , Cache , Service comme divers objets représentant nos entités. Service1 et Service2 représentent des services concrets.

ServiceLocatorPatternDemo , notre classe de démonstration, agit ici en tant que client et utilisera ServiceLocator pour démontrer le modèle de conception de Service Locator.

Étape 1

Créer une interface de service.

Service.java

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

Étape 2

Créez des services concrets.

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";
   }
}

Étape 3

Créer InitialContext pour la recherche 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;		
   }
}

Étape 4

Créer un 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);
      }
   }
}

Étape 5

Créer un localisateur de services

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;
   }
}

Étape 6

Utilisez ServiceLocator pour illustrer le modèle de conception de 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();		
   }
}

Étape 7

Vérifiez la sortie.

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