Proxy-Muster
Kurz: Ein Proxy ist ein Stellvertreter-Objekt, das dieselbe Schnittstelle wie das echte Objekt hat und davor sitzt. Er kann den Zugriff prüfen, verzögern, zwischenspeichern oder protokollieren.
Typen
- Virtueller Proxy (Lazy Loading): Das teure Objekt (großes Bild, Datenbankverbindung) wird erst erzeugt, wenn es wirklich gebraucht wird (Lazy Evaluation).
- Schutz-Proxy: Prüft vorher, ob der Aufrufer das darf.
- Cache-Proxy: Merkt sich Ergebnisse (Caching-Strategien, Memoization).
- Entfernter Proxy: Tut so, als wäre das Objekt lokal, spricht aber übers Netzwerk (RPC, siehe GraphQL und gRPC).
- Protokoll-Proxy: Zeichnet Aufrufe auf.
Beispiel
class Bild:
def zeigen(self): ...
class EchtesBild(Bild):
def __init__(self, datei):
self.daten = lade(datei) # teuer
def zeigen(self): zeichne(self.daten)
class BildProxy(Bild):
def __init__(self, datei):
self.datei, self.echt = datei, None
def zeigen(self):
if self.echt is None: # erst beim ersten Mal laden
self.echt = EchtesBild(self.datei)
self.echt.zeigen()Abgrenzung
Ähnlich wie Decorator-Muster und Adapter verpackt der Proxy ein Objekt, aber mit anderem Ziel: Der Proxy steuert den Zugriff bei gleicher Schnittstelle, der Decorator fügt Funktionen hinzu, der Adapter passt eine andere Schnittstelle an. Nicht verwechseln mit dem Netzwerk-Proxy (Proxy), der nach demselben Gedanken arbeitet.
Siehe auch: Fassade-Muster