Das Proxy-Muster in Java

1. Übersicht

Mit dem Proxy-Muster können wir einen Vermittler erstellen, der als Schnittstelle zu einer anderen Ressource fungiert und gleichzeitig die zugrunde liegende Komplexität der Komponente verbirgt.

2. Beispiel für ein Proxy-Muster

Stellen Sie sich ein schweres Java-Objekt vor (z. B. eine JDBC-Verbindung oder eine SessionFactory ), für das eine Erstkonfiguration erforderlich ist.

Wir möchten, dass solche Objekte nur bei Bedarf initialisiert werden, und sobald sie vorhanden sind, möchten wir sie für alle Aufrufe wiederverwenden:

Lassen Sie uns nun eine einfache Schnittstelle und die Konfiguration für dieses Objekt erstellen:

public interface ExpensiveObject { void process(); }

Und die Implementierung dieser Schnittstelle mit einer großen Erstkonfiguration:

public class ExpensiveObjectImpl implements ExpensiveObject { public ExpensiveObjectImpl() { heavyInitialConfiguration(); } @Override public void process() { LOG.info("processing complete."); } private void heavyInitialConfiguration() { LOG.info("Loading initial configuration..."); } }

Wir werden jetzt das Proxy-Muster verwenden und unser Objekt bei Bedarf initialisieren:

public class ExpensiveObjectProxy implements ExpensiveObject { private static ExpensiveObject object; @Override public void process() { if (object == null) { object = new ExpensiveObjectImpl(); } object.process(); } }

Wenn unser Client die process () -Methode aufruft , sieht er nur die Verarbeitung und die Erstkonfiguration bleibt immer verborgen:

public static void main(String[] args) { ExpensiveObject object = new ExpensiveObjectProxy(); object.process(); object.process(); }

Beachten Sie, dass wir die process () -Methode zweimal aufrufen . Hinter den Kulissen wird der Einstellungsteil nur einmal ausgeführt - wenn das Objekt zum ersten Mal initialisiert wird.

Bei jedem weiteren nachfolgenden Aufruf überspringt dieses Muster die Erstkonfiguration und es erfolgt nur die Verarbeitung:

Loading initial configuration... processing complete. processing complete.

3. Wann wird Proxy verwendet?

Es ist wichtig zu verstehen, wie ein Muster verwendet wird.

Es ist wichtig zu verstehen, wann es verwendet werden muss.

Lassen Sie uns darüber sprechen, wann das Proxy-Muster verwendet werden soll:

  • Wenn wir eine vereinfachte Version eines komplexen oder schweren Objekts wollen. In diesem Fall können wir es mit einem Skelettobjekt darstellen, das das ursprüngliche Objekt bei Bedarf lädt, was auch als verzögerte Initialisierung bezeichnet wird. Dies wird als virtueller Proxy bezeichnet
  • Wenn das ursprüngliche Objekt in einem anderen Adressraum vorhanden ist und wir es lokal darstellen möchten . Wir können einen Proxy erstellen, der alle erforderlichen Funktionen wie das Erstellen und Verwalten der Verbindung, das Codieren, Decodieren usw. ausführt, während der Client darauf zugreift, wie es in seinem lokalen Adressraum vorhanden war. Dies wird als Remote-Proxy bezeichnet
  • Wenn wir dem ursprünglichen zugrunde liegenden Objekt eine Sicherheitsebene hinzufügen möchten, um einen kontrollierten Zugriff basierend auf den Zugriffsrechten des Clients bereitzustellen . Dies wird als Schutzproxy bezeichnet

4. Fazit

In diesem Artikel haben wir uns das Proxy-Design-Muster angesehen. Dies ist in folgenden Fällen eine gute Wahl:

  • Wenn wir eine vereinfachte Version eines Objekts haben oder sicherer auf das Objekt zugreifen möchten
  • Wenn wir eine lokale Version eines Remote-Objekts wollen

Der vollständige Quellcode für dieses Beispiel ist auf GitHub verfügbar.