Proxy-Muster
Im Proxy-Muster repräsentiert eine Klasse die Funktionalität einer anderen Klasse. Diese Art von Entwurfsmuster ist ein Strukturmuster.
Das Proxy-Muster steuert den Zugriff auf das ursprüngliche Objekt, indem es ein Proxy-Objekt einführt. Das Proxy-Objekt fungiert als Vermittler zwischen dem Client und dem Zielobjekt, ist dafür verantwortlich, die Anfragen des Clients an das Zielobjekt weiterzuleiten, und kann vor und nach der Weiterleitung der Anfrage zusätzliche Verarbeitung durchführen.
Im Proxy-Muster erstellen wir ein Objekt, das ein vorhandenes Objekt enthält, um der Außenwelt eine funktionale Schnittstelle bereitzustellen.
Einführung
Absicht
Ein Proxy für ein anderes Objekt bereitstellen, um den Zugriff auf dieses Objekt zu steuern.
Hauptprobleme gelöst
- Das Proxy-Muster löst Probleme, die beim direkten Zugriff auf bestimmte Objekte auftreten können, wie hohe Erstellungskosten für Objekte, Notwendigkeit der Sicherheitskontrolle oder Fernzugriff.
Anwendungsfall
- Wenn beim Zugriff auf ein Objekt eine gewisse Kontrolle oder zusätzliche Verarbeitung erforderlich ist.
Implementierungsansatz
- Zwischenschicht hinzufügen: Erstellen Sie eine Proxy-Klasse als Zwischenschicht für das reale Objekt.
- Komposition von Proxy und realem Objekt: Die Proxy-Klasse hält eine Referenz auf das reale Objekt und kontrolliert den Zugriff, wenn darauf zugegriffen wird.
Schlüsselcode
- Proxy-Klasse: Implementieren Sie dieselbe Schnittstelle wie das reale Objekt und fügen Sie zusätzliche Steuerlogik hinzu.
- Reales Objekt: das Objekt, das die Aufgabe tatsächlich ausführt.
Anwendungsbeispiel
- Verknüpfung: Verknüpfungen im Windows-System fungieren als Proxys für Dateien oder Programme.
- Rollenspiel: Sun Wukong fungiert als Stellvertreter für Gao Cuilan, und Zhu Bajie kann sie nicht voneinander unterscheiden.
- Verkaufsstelle: Beim Kauf von Fahrkarten fungiert die Fahrkartenagentur als Proxy für den Bahnhof.
- Scheck: Als Stellvertreter für das Guthaben auf dem Bankkonto kontrolliert er den Zugriff auf die Mittel.
- Spring AOP: Verwenden Sie das Proxy-Muster, um aspektorientierte Programmierung zu implementieren.
Vorteile
- Trennung der Belange: Das Proxy-Muster trennt die Zugriffskontrolle von der Geschäftslogik.
- Erweiterbarkeit: Es ist flexibel, zusätzliche Funktionalität oder Kontrolle hinzuzufügen.
- Intelligent: Es kann Zugriffsanfragen intelligent verarbeiten, wie z. B. Lazy Loading, Caching usw.
Nachteile
- Leistungs-Overhead: Das Hinzufügen einer Proxy-Schicht kann die Verarbeitungsgeschwindigkeit von Anfragen beeinträchtigen.
- Implementierungskomplexität: Einige Arten von Proxy-Mustern können komplexer zu implementieren sein.
Verwendungshinweise
- Wählen Sie den passenden Proxy-Typ entsprechend den spezifischen Anforderungen, wie Remote-Proxy, virtueller Proxy, Schutz-Proxy usw.
- Stellen Sie sicher, dass die Schnittstelle der Proxy-Klasse mit dem realen Objekt übereinstimmt, damit Clients den Proxy transparent nutzen können.
Hinweise
- Unterschied zum Adapter-Muster: Das Adapter-Muster ändert die Schnittstelle, während das Proxy-Muster die Schnittstelle nicht ändert.
- Unterschied zum Decorator-Muster: Das Decorator-Muster wird verwendet, um Funktionalität zu erweitern, während das Proxy-Muster verwendet wird, um den Zugriff zu steuern.
Struktur
Es umfasst hauptsächlich die folgenden Kernrollen:
Abstraktes Subjekt:
- Definiert eine gemeinsame Schnittstelle für das reale Subjekt und das Proxy-Subjekt, sodass das Proxy-Subjekt überall dort verwendet werden kann, wo das reale Subjekt verwendet wird.
Reales Subjekt:
- Implementiert die Schnittstelle des abstrakten Subjekts und ist das reale Objekt, das durch das Proxy-Objekt repräsentiert wird. Der Client greift direkt auf das reale Subjekt zu, in einigen Fällen kann jedoch indirekt über das Proxy-Subjekt darauf zugegriffen werden.
Proxy:
- Implementiert die Schnittstelle des abstrakten Subjekts und hält eine Referenz auf das reale Subjekt. Das Proxy-Subjekt bietet üblicherweise zusätzliche Funktionalität zusätzlich zum realen Subjekt, wie Lazy Loading, Berechtigungskontrolle, Protokollierung usw.
Client:
- Verwendet die abstrakte Subjekt-Schnittstelle, um auf das reale Subjekt oder das Proxy-Subjekt zu operieren, ohne wissen zu müssen, um welche konkrete Implementierungsklasse es sich handelt.
Implementierung
Wir erstellen eineImageSchnittstelle und implementierenImagedie Entitätsklasse der Schnittstelle.ProxyImageist eine Proxy-Klasse, dieRealImageden Speicherbedarf beim Laden von Objekten reduziert.
ProxyPatternDemoKlassenverwendungProxyImage, um das zu ladendeImageObjekt zu erhalten und es nach Bedarf anzuzeigen.
Schritt 1
Erstellen Sie eine Schnittstelle.
Image.java
Schritt 2
Erstellen Sie eine Entitätsklasse, die die Schnittstelle implementiert.
RealImage.java
ProxyImage.java
Schritt 3
Bei Bedarf verwenden SieProxyImagezum Erhalten vonRealImage-Objekt der Klasse.
ProxyPatternDemo.java
Schritt 4
Führen Sie das Programm aus, und geben Sie das Ergebnis aus:
Loading test_10mb.jpg Displaying test_10mb.jpg Displaying test_10mb.jpgWeitere Erweiterungen