Proxy3

Werbung
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!
Herunterladen