Patron Localisateur de services

Le modèle de localisateur de services est utilisé lorsque nous voulons localiser divers services à l'aide de requêtes JNDI. Étant donné que l'exécution d'une recherche JNDI pour un service est coûteuse, le modèle de localisateur de services tire pleinement parti de la technologie de mise en cache. Lorsqu'un service est demandé pour la première fois, le localisateur de services recherche le service dans JNDI et met en cache l'objet de service. Lorsque le même service est demandé à nouveau, le localisateur de services le recherche dans son cache, ce qui peut grandement améliorer les performances de l'application. Voici les entités de ce modèle de conception.

  • Service- Le service qui traite réellement les requêtes. Les références à ces services peuvent être trouvées dans le serveur JNDI.
  • Contexte / Contexte initial- Le contexte JNDI contient des références aux services à rechercher.
  • Localisateur de services- Le localisateur de services est un point de contact unique pour obtenir des services via la recherche JNDI et la mise en cache des services.
  • Cache- Le cache stocke des références à des services afin de les réutiliser.
  • ClientLe client est un objet qui invoque des services via ServiceLocator.

summary

intention

Utilisé pour fournir un point d'accès centralisé aux services dans une application afin d'obtenir divers services ou ressources.

Problème principal résolu

  • Résout le problème consistant à éviter la logique d'accès aux services codée en dur lorsqu'une application doit accéder à divers services ou ressources.

Cas d'utilisation

  • Lorsqu'une application doit accéder à plusieurs services ou ressources externes et souhaite gérer de manière centralisée cette logique d'accès.

Approche d'implémentation

  • Interface de localisateur de servicesDéfinir des méthodes pour obtenir des services.
  • Implémentation du localisateur de services: Implémenter l'interface du localisateur de services, en encapsulant la logique de recherche et d'accès aux services.
  • Interface de serviceDéfinir l'interface de service ou le contrat.
  • Service concret: Implémenter l'interface de service, en fournissant une fonctionnalité de service spécifique.

Code clé

  • Localisateur de servicesContient la logique pour trouver et renvoyer l'instance de service demandée.
  • Interface de serviceDéfinir une représentation abstraite du service.

Exemple d'application

  • Application d'entreprise: L'application utilise le localisateur de services pour accéder aux services de base de données, aux services de file d'attente de messages, etc.

Avantages

  1. Découpler l'accès aux services: Sépare la logique d'accès aux services de la logique métier qui utilise les services.
  2. Gestion centralisée: Les points d'accès aux services sont gérés de manière centralisée, ce qui facilite la maintenance et l'extension.
  3. FlexibilitéIl est facile d'ajouter, de modifier ou de remplacer des services.

Inconvénients

  • Problèmes de performance: Le localisateur de services peut introduire une surcharge de performance, en particulier lorsqu'une recherche est effectuée à chaque demande de service.
  • Utilisation excessive: Peut conduire à une mauvaise utilisation du patron de conception, masquant ainsi la structure du système.

Suggestions d'utilisation

  • Lorsqu'une application doit accéder à plusieurs services de manière flexible et facile à maintenir, envisagez d'utiliser le patron de localisateur de services.

Notes

  • Évitez de dépendre excessivement du localisateur de services, car il peut masquer les dépendances du système, ce qui rend le débogage et l'optimisation difficiles.

Contient plusieurs rôles principaux

  1. Interface du localisateur de services:

    • Définir des méthodes pour obtenir des services.
  2. Implémentation du localisateur de services:

    • Implémenter l'interface du localisateur de services, en encapsulant la logique de recherche et d'accès aux services.
  3. Interface de service:

    • Définir une représentation abstraite du service.
  4. Service concret:

    • Implémenter l'interface de service, en fournissant des fonctionnalités de service spécifiques.
  5. Client:

    • Utiliser le localisateur de services pour accéder aux services requis.

Le patron de conception Service Locator aide à simplifier la logique d'accès aux services et à améliorer la flexibilité et la maintenabilité de l'application en fournissant un point d'accès centralisé aux services.


<

Implémentation

Nous allons créerServiceLocator、InitialContext、Cache、ServiceDivers objets représentant des entités.Service1etService2Représentent un service d'entité.

ServiceLocatorPatternDemoLa classe ici agit comme un client et utiliseraServiceLocatorpour démontrer le patron de conception Service Locator.

服务定位器模式的 UML 图

Étape 1

Créer l'interface de service Service.

Service.java

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

Étape 2

Crée un service d'entité.

Service1.java

public class Service1 implements Service { public void execute(){ System.out.println("Exécution de Service1"); } @Override public String getName() { return "Service1"; } }

Service2.java

public class Service2 implements Service { public void execute(){ System.out.println("Exécution de Service2"); } @Override public String getName() { return "Service2"; } }

Étape 3

Créer un InitialContext pour les requêtes JNDI.

InitialContext.java

public class InitialContext { public Object lookup(String jndiName){ if(jndiName.equalsIgnoreCase("SERVICE1")){ System.out.println("Recherche et création d'un nouvel objet Service1"); return new Service1(); }else if (jndiName.equalsIgnoreCase("SERVICE2")){ System.out.println("Recherche et création d'un nouvel objet Service2"); return new Service2(); } return null; } }

Étape 4

Créer un cache 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("Retour du cache "+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

UtilisationServiceLocatorPour démontrer le patron de conception 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

Exécutez le programme, résultat de 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
autres extensions