Modèle de localisateur de services
Le modèle de localisation de services est utilisé lorsque nous souhaitons utiliser une requête JNDI pour localiser divers services. Étant donné que la recherche d'un service dans JNDI coûte cher, le modèle de localisateur de services tire parti de la technologie de mise en cache. La première fois qu'un service est demandé, le localisateur de service recherche le service dans JNDI et met en cache l'objet de service. Lorsque le même service est à nouveau demandé, le localisateur de services recherche dans son cache, ce qui peut améliorer considérablement les performances de l'application. Voici les entités de ce modèle de conception.
Service - Le service qui gère réellement la demande. Une référence à ce service peut être trouvée sur le serveur JNDI.
Contexte / Contexte initial - Contexte JNDI avec une référence au service à trouver.
Localisateur de services - Le localisateur de services est un point de contact unique pour obtenir des services via les services de recherche et de mise en cache JNDI.
Cache - Le cache stocke les références aux services afin qu'elles puissent être réutilisées.
Client - Le client est l'objet qui appelle le service via ServiceLocator.
En implémentant
nous allons créer ServiceLocator, InitialContext, Cache, Service comme divers objets représentant des entités. Service1 et Service2 représentent les services d'entité.
ServiceLocatorPatternDemo, notre classe de démonstration est ici en tant que client et utilisera ServiceLocator pour démontrer le modèle de conception du localisateur de services.
Étape 1
Créer l'interface de service Service.
Service.java
public interface Service { public String getName(); public void execute(); }
Étape 2
Créez le service d'entité.
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 pour une requête JNDI Contexte initial.
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éez 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 démontrer 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