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!