Muster: Proxy

Aus Wikibooks

Stellvertreter[Bearbeiten]

Der Delegierer oder Stellvertreter (engl. proxy) kontrolliert den Zugriff auf ein Objekt durch ein vorgelagertes Stellvertreterobjekt.

Zweck[Bearbeiten]

Die Idee des Stellvertreter-Musters besteht darin, dem tatsächlichen Objekt einen Stellvertreter vorzulagern, der Methodenaufrufe entgegennimmt und diese - je nach Verwendungszweck ergänzt durch entsprechende eigene Aktionen - dann an das eigentliche Objekt weiterreicht. Dieser Vorgang vollzieht sich für den Benutzer transparent, d.h. er bleibt von ihm unbemerkt. Erreichen lässt sich dies, indem das echte Objekt und sein Stellvertreter die gleiche Schnittstelle offerieren.

Hier einige typische Situationen, in denen sich dieses Muster als nützlich erweisen kann:

  • Caching: Angenommen die eigentliche Operation ist sehr teuer; ein Stellvertreter könnte in einem Cache Berechnungsergebnisse gespeichert halten und nur bei Bedarf (d.h. wenn sich das passende Ergebnis noch nicht im Cache befindet) die Berechnung durch das tatsächliche Objekt veranlassen.
  • Synchronisation: Der Stellvertreter synchronisiert die Zugriffe auf das tatsächliche Objekt. Hilfreich, wenn selbiges nicht für Multithread-Umgebungen ausgelegt ist.
  • Protokollierung: Zugriffe werden protokolliert (z.B. während eines Testlaufs)
  • Remote-Proxy: Das tatsächliche Objekt befindet sich in einem anderen Adressraum; der Stellvertreter gibt den Aufruf über das Netzwerk weiter.
  • Zugriffsschutz: Besonders nützlich, wenn unterschiedliche Benutzer verschiedene Zugriffsrechte auf das zu schützende Objekt haben sollen.
  • Virtueller Stellvertreter: Erzeugt teure Objekte erst auf Verlangen (on demand, verzögertes Laden)

Stellvertreter können bei Bedarf auch kaskadiert eingesetzt werden.

UML[Bearbeiten]

Entscheidungshilfen[Bearbeiten]

Die obige Auflistung möglicher Szenarien ließe sich fast beliebig erweitern; generell kann ein Stellvertreter nützlich sein, wenn es für den Zugriff auf das tatsächliche Objekt spezielle Anforderungen gibt, wobei diese Funktionalität aber nicht von diesem selbst bereitgestellt werden soll.

Implementation[Bearbeiten]

Um einen Stellvertreter zu implementieren braucht man:

  • Eine dem Stellvertreter und dem tatsächlichen Objekt gemeinsame Schnittstelle
  • Eine Implementation des tatsächlichen Objektes und
  • Ein Stellvertreterobjekt, welches Methodenaufrufe an das tatsächliche Objekt weiterleitet. Diese Weiterleitung kann durch entsprechende Funktionalität (siehe Auflistung weiter oben) ergänzt werden.

Beispiele gibt es für die folgenden Sprachen:

Verwandte Muster[Bearbeiten]

Der Dekorator kann als ein Spezialfalls eines Stellvertreters betrachtet werden. Außerdem zu nennen wäre der Adapter: Auch dieser leitet Aufrufe an ein "echtes Objekt" weiter - allerdings geschieht dies nicht transparent, da der Adapter die Schnittstelle des tatsächlichen Objektes nicht übernimmt, sondern seine eigene zur Verfügung stellt.