Service-Locator-Muster
Das Service-Locator-Muster wird verwendet, wenn wir verschiedene Dienste mithilfe von JNDI-Abfragen lokalisieren möchten. Da die Durchführung einer JNDI-Suche nach einem Dienst teuer ist, nutzt das Service-Locator-Muster die Caching-Technologie voll aus. Wenn ein Dienst zum ersten Mal angefordert wird, sucht der Service-Locator den Dienst in JNDI und speichert das Dienstobjekt im Cache. Wenn derselbe Dienst erneut angefordert wird, sucht der Service-Locator ihn in seinem Cache, was die Anwendungsleistung erheblich verbessern kann. Die folgenden sind die Entitäten dieses Entwurfsmusters.
- Dienst- Der Dienst, der Anfragen tatsächlich verarbeitet. Verweise auf solche Dienste können im JNDI-Server gefunden werden.
- Kontext / Initialer Kontext- Der JNDI-Kontext enthält Verweise auf die nachzuschlagenden Dienste.
- Service-Locator- Der Service-Locator ist eine zentrale Anlaufstelle, um Dienste über JNDI-Lookup und Dienst-Caching zu beziehen.
- Cache- Der Cache speichert Referenzen auf Dienste, um sie wiederverwenden zu können.
- ClientClient ist ein Objekt, das Dienste über ServiceLocator aufruft.
summary
Absicht
Wird verwendet, um in einer Anwendung einen zentralen Dienstzugriffspunkt für den Bezug verschiedener Dienste oder Ressourcen bereitzustellen.
Gelöstes Hauptproblem
- Löst das Problem, hartkodierte Dienstzugriffslogik zu vermeiden, wenn eine Anwendung auf verschiedene Dienste oder Ressourcen zugreifen muss.
Anwendungsfall
- Wenn eine Anwendung auf mehrere externe Dienste oder Ressourcen zugreifen muss und diese Zugriffslogik zentral verwalten möchte.
Implementierungsansatz
- Service-Locator-SchnittstelleMethoden zum Abrufen von Diensten definieren.
- Service-Locator-Implementierung: Implementiert die Service-Locator-Schnittstelle und kapselt die Dienstsuche und Zugriffslogik.
- DienstschnittstelleDienstschnittstelle oder Vertrag definieren.
- Konkreter Dienst: Implementiert die Dienstschnittstelle und stellt spezifische Dienstfunktionalität bereit.
Schlüsselcode
- Service-LocatorEnthält Logik, um die angeforderte Dienstinstanz zu finden und zurückzugeben.
- DienstschnittstelleEine abstrakte Darstellung des Dienstes definieren.
Anwendungsbeispiel
- Unternehmensanwendung: Die Anwendung verwendet den Service-Locator, um auf Datenbankdienste, Nachrichtenwarteschlangendienste usw. zuzugreifen.
Vorteile
- Entkopplung des Dienstzugriffs: Trennt die Dienstzugriffslogik von der Geschäftslogik, die die Dienste verwendet.
- Zentralisierte Verwaltung: Dienstzugriffspunkte werden zentral verwaltet, was Wartung und Erweiterung erleichtert.
- FlexibilitätDienste lassen sich einfach hinzufügen, ändern oder ersetzen.
Nachteile
- Leistungsprobleme: Der Service Locator kann zusätzlichen Leistungsaufwand verursachen, insbesondere wenn bei jeder Dienstanforderung eine Suche durchgeführt wird.
- Übermäßige Nutzung: Kann zu einem Missbrauch des Entwurfsmusters führen und dadurch die Systemstruktur verbergen.
Verwendungshinweise
- Wenn eine Anwendung auf flexible und wartbare Weise auf mehrere Dienste zugreifen muss, sollte die Verwendung des Service-Locator-Musters in Betracht gezogen werden.
Hinweise
- Vermeiden Sie eine übermäßige Abhängigkeit vom Service Locator, da er die Abhängigkeiten des Systems verschleiern kann, was Debugging und Optimierung erschwert.
Enthält mehrere Hauptrollen
-
Service-Locator-Schnittstelle:
- Definiert Methoden zum Abrufen von Diensten.
-
Service-Locator-Implementierung:
- Implementiert die Service-Locator-Schnittstelle und kapselt die Dienstsuche und Zugriffslogik.
-
Service-Schnittstelle:
- Definieren Sie eine abstrakte Repräsentation des Dienstes.
-
Konkreter Service:
- Implementieren Sie die Service-Schnittstelle, um spezifische Servicefunktionalität bereitzustellen.
-
Client:
- Verwenden Sie den Service Locator, um auf die erforderlichen Dienste zuzugreifen.
Das Service-Locator-Muster hilft, die Logik für den Dienstzugriff zu vereinfachen und die Flexibilität und Wartbarkeit der Anwendung zu verbessern, indem es einen zentralisierten Dienstzugriffspunkt bereitstellt.
<
Implementierung
Wir werdenServiceLocator,、InitialContext,、Cache,、Service,verschiedene Objekte erstellen, die Entitäten repräsentieren.Service1undService2repräsentieren einen Entitätsdienst.
ServiceLocatorPatternDemoDie Klasse hier fungiert als Client und verwendetServiceLocator,um das Service-Locator-Entwurfsmuster zu demonstrieren.
Schritt 1
Erstellen Sie die Service-Schnittstelle Service.
Service.java
Schritt 2
Erstellt einen Entity-Service.
Service1.java
Service2.java
Schritt 3
Erstellen Sie einen InitialContext für JNDI-Abfragen.
InitialContext.java
Schritt 4
Erstellen Sie einen Cache Cache.
Cache.java
Schritt 5
Erstellen Sie einen Service-Locator.
ServiceLocator.java
Schritt 6
VerwendungServiceLocatorUm das Service-Locator-Entwurfsmuster zu demonstrieren.
ServiceLocatorPatternDemo.java
Schritt 7
Führen Sie das Programm aus, Ausgabeergebnis:
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 Service2Weitere Erweiterungen