Proxy

Jan Zacharias

André Hohmann

Ngo Duc Thu

Zweck

Kontrolliere den Zugriff auf ein Objekt mit Hilfe eines vorgelagerten Stellvertreterobjekts

auch bekannt als Surrogat

Motivation I

die vollen Kosten der Erzeugung und Initialisierung eines Objektes soweit zu verzögern, bis das Objekt tatsächlich benutzt wird

z.B. Dokumenteditor, der grafische Objekte in einem Dokument einbetten kann → die Erzeugung mancher grafischer Objekte, wie großer gerasterter Bilder, kann sehr teuer sein

das Öffnen eines Dokuments sollte aber schnell geschehen → nicht alle teuren Objekte auf einmal erzeugen, da ohnehin nicht alle Objekte des Dokuments zum selben Zeitpunkt sichtbar sein werden

Motivation II

diese Bedingungen legen es nahe, alle teuren Objekte erst auf Verlangen zu erzeugen, also z.B. genau dann, wenn Bild sichtbar wird

Fragen:

Was wird an Stelle des Bildes im Dokument verwendet?

Wie kann man die Tatsache verstecken, dass das Bild auf Verlangen erzeugt wird, um die Implementierung des Editors nicht komplizierter zu machen?

Motivation III

Lösung:
- ein anderes Objekt, ein Proxy, anstelle des Bildes
verwenden, das als Platzhalter für das richtige Bild
fungiert

Proxy verhält sich genauso wie das Bild und sorgt dafür, dass es erzeugt wird, wenn es benötigt wird

es erzeugt das tatsächliche Bild nur dann, wenn der Dokumenteditor mittels Aufruf der Zeichne- Operation befiehlt, es anzuzeigen

es leitet weitere Operationsaufrufe direkt an das Bild weiter → muss nach seiner Erzeugung eine Referenz auf Bild behalten

Motivation IV

Dateiname: Referenz auf richtiges Objekt

Proxy speichert zudem Maße des Bildes → kann
somit auf Anfragen des Formatierers nach Größe
antworten, ohne Bild tatsächlich zu laden

Anwendbarkeit

wenn es Bedarf nach einer anpassungsfähigeren und intelligenteren Referenz auf ein Objekt als einen einfachen Zeiger gibt

z.B.:

Remote- Proxy: stellt einen lokalen Stellvertreter für ein Objekt in einem anderen Adressraum dar (auch: Ambassador)

Virtuelles Proxy: erzeugt teure Objekte auf Verlangen (Bildproxy)

Schutzproxy: kontrolliert Zugriff auf Originalobjekt; nützlich, wenn Objekte über verschiedene Zugriffsrechte verfügen sollen (z.B. schützen KernelProxies im BS Choices Zugriff auf BS- Objekte)

Smart- Referenz: Ersatz für einen einfachen Zeiger mit zus. Aktionen bei Zugriff: Zählen der Referenzen (Smart- Pointer); Laden eines persistenten Objektes in Speicher, wenn es das 1. Mal dereferenziert wird; Testen, ob Objekt gelockt

Struktur

Teilnehmer I

Proxy:
- verwaltet Referenz zum Zugriff auf eigentliches Objekt
- bietet Schnittstelle, die mit der von Subjekt identisch ist,
so dass es für dieses eingesetzt werden kann
- kontrolliert Zugriff auf eigentliches Objekt und ist
zuständig, es zu erzeugen und zu löschen
- weitere Zuständigkeiten:
- Remote- Proxies kodieren Anfrage und ihre
Argumente und senden sie an eigentl. Subjekt in
anderem Adressraum
- Virtuelle Proxies können zusätzl. Informationen
über eigentl. Subjekt zwischenspeichern, somit
Zugriff verzögern (Bildproxy → Maße)
- Schutzproxies überprüfen Zugriffsrechte des Aufrufers

Teilnehmer II

Subjekt (Grafik):
- definiert gemeinsame Schnittstelle von
EigentlichesSubjekt und Proxy, somit kann Proxy
überall dort benutzt werden, wo EigentlichesSubjekt
erwartet wird

EigentlichesSubjekt:
- definiert das eigentliche Subjekt, welches durch Proxy
repräsentiert wird

Interaktionen:
- je nach Art des Proxies leitet es Befehle an
EigentlichesSubjekt weiter

Konsequenzen

Proxymuster führt Ebene der Indirektion (Umwege, Abhängigkeiten) beim Zugriff auf ein Objekt ein, die vielfältig verwendet werden kann:
- ein Remote- Proxy kann Tatsache verstecken,
dass sich Objekt in einem anderen Adressraum
befindet
- ein virtuelles Proxy kann Optimierungen ausführen,
z.B. erzeugen eines Objekts auf Verlangen
- Schutzproxies und Smart- References ermöglichen
Durchführung zusätzlicher Verwaltungsaufgaben

Weitere Optimierung

Copy-On-Write:
- ist der Erzeugung auf Verlangen verwandt
- Kopieren eines großen Objekts kann teuer sein; wenn
Kopie nie verändert wird, gibt es keinen Grund, Kosten
auf sich zu nehmen → Proxy verwenden, um Preis für
Kopieren nur dann zu zahlen, wenn Objekt wirklich
modifiziert wird
- dabei zählt Proxy lediglich die Referenzen auf ein
Subjekt; wenn Klient eine Operation ausführen will, die
Subjekt verändert, kopiert Proxy das Objekt tatsächlich
und zählt den Referenzzähler runter; wenn
Referenzzähler Null erreicht, wird Subjekt gelöscht

Implementation I

public interface Grafik {

public void display();

}

public class Bild implements Grafik {

public class Bitmap { }

protected Bitmap bm;

public Bild(String quelle) {

bm = new Bitmap();

// Bitmap aus Quelle laden

// teure Operation

}

public void display() {

// Bild anzeigen wenn sichtbar

// zB. drawImage()

}

}

Implementation II

public class Bildproxy implements Grafik {

protected String quelle;

protected Bild bild;

public Bildproxy( String quelle ) {

this.quelle = quelle;

// noch nicht Laden - verursacht keine Kosten

}

protected void lade() {

if ( bild == null ) {

// teure Operation erst hier

bild = new Bild(quelle);

}

}

public void display() {

lade();

bild.display();

}

}

DANKE FÜR DIE AUFMERKSAMKEIT!

Proxy

2005-06-06T19:01:11