Commit f5f3a380 authored by Blanke, Daniela's avatar Blanke, Daniela
Browse files

Update design-patterns-proxy.html

parent 21e82fd9
Pipeline #8018 failed with stage
in 46 seconds
......@@ -8,17 +8,17 @@
<img src="media/patterns_proxy.png" style="width:450px">
<label>Entwurfsmuster Proxy</label>
<p>Das Proxy-Muster bringt zunächst einen eindeutigen folgenden Nachteil mit sich: Es entsteht durch die Proxy-Klasse zusätzlicher Code, der die Komplexität im Call-Stack und den verbundenen Aufwand für Test und Wartung erhöht. Für die zusätzliche Kontrollebene, die durch den Proxy gewonnen wird, muss es also gute Gründe geben, die folgend exemplarisch vorgestellt werden. Voraussetzung für die Notwendigkeit einer Proxy-Klasse ist es, dass die dahinterliegende Klasse nicht verändert werden kann oder soll.</p>
<p>Das Proxy-Muster bringt zunächst einen eindeutigen Nachteil mit sich: Es entsteht durch die Proxy-Klasse zusätzlicher Code, der die Komplexität im Call-Stack und den verbundenen Aufwand für Test und Wartung erhöht. Für die zusätzliche Kontrollebene, die durch den Proxy gewonnen wird, muss es also gute Gründe geben, die folgend exemplarisch vorgestellt werden. Voraussetzung für die Notwendigkeit einer Proxy-Klasse ist es, dass die dahinterliegende Klasse nicht verändert werden kann oder soll.</p>
<ul>
<li><b>Schutz-Proxy</b>: Ein Schutz-Proxy fängt den Zugriff auf das echte Zielobjekt ob, um diesen ggf. nach Prüfung der Autorisierung einzuschränken. Ein solcher Proxy kann eingesetzt werden, wenn die abzusichernde Klasse selbst nicht angepasst werden kann, weil ihr Code nicht zugänglich ist oder Änderungen nicht zulässig sind (z.B. aus lizenzrechtlichen Gründen).</li>
<li><b>Schutz-Proxy</b>: Ein Schutz-Proxy fängt den Zugriff auf das echte Zielobjekt ab, um diesen ggf. nach Prüfung der Autorisierung einzuschränken. Ein solcher Proxy kann eingesetzt werden, wenn die abzusichernde Klasse selbst nicht angepasst werden kann, weil ihr Code nicht zugänglich ist oder Änderungen nicht zulässig sind (z.B. aus lizenzrechtlichen Gründen).</li>
<li><b>Remote-Proxy</b>: Ein Remote-Proxy ist ein Stellvertreterobjekt auf der Seite des Client, wenn dieser Methoden auf Remote-Objekten aufruft, die in einer anderen Laufzeitumgebung (z.B. einer entfernten JVM) residieren. Die andere Laufzeitumgebung wird in einem anderen Prozess und Adressraum ausgeführt, meistens sogar auf einem anderen Host, und bietet einen <i>Remote Service</i> an, der von außen aufgerufen werden kann (s. Kapitel <a href="#unit-rmi" class="navigate">Remote Method Invocation</a> und <a href="#unit-soap" class="navigate">SOAP-Webservices</a>). Der Remote-Proxy ist der Endpunkt für diese Interprozesskommunikation im Adressraum des Client – als Stellvertreter des Remote-Objekts im entfernten Adressraum. Der Proxy übernimmt das Verpacken der Input-Argumente bei einem Methodenaufruf auf dem Remote-Objekt in ein Serialisierungsformat (z.B. <code>java.io.Serializable</code>) und das entsprechende Entpacken des Return-Arguments, wenn die Antwort eingeht. Der Proxy delegiert die erforderliche Netzwerkkommunikation an die Laufzeitumgebung bzw. das Betriebssystem und kümmert sich um Fehlerfälle wie z.B. <i>Timeouts</i>.</li>
<li><b>Virtueller Proxy</b>: Ein virtueller Proxy wird eingesetzt, wenn die Erzeugung des Zielobjekts sehr aufwändig ist, d.h. es werden dazu viele Ressourcen beansprucht. Der Proxy kann in diesem Fall die vollständige Erzeugung des Zielobjekts verzögern oder sie in einzelne Teilschritte zerlegen. Da der Proxy den Zugriff auf das Zielobjekt kontrolliert, kann er dessen einzelne Teile ggf. erst bei Bedarf, d.h. beim ersten Zugriff, erzeugen lassen (= <i>Lazy Loading</i>). Ein virtueller Proxy eignet sich wenn das eigentliche Zielobjekt groß und behäbig ist, z.B. beim Einlesen eines komplexen Objekts aus einer sehr großen Datei oder Datenbank. Ein virtueller Proxy lässt sich häufig sinnvoll mit einem Remote-Proxy kombinieren, wenn über eine Netzwerkverbindung mit eingeschränkter Datenübertragungsrate kommuniziert wird, z.B. beim Mobilfunk mit schlechtem Empfang.</li>
</ul>
<p>Im folgenden Code-Beispiel zur Verdeutlichung des Proxy-Musters besteht die Funktion des Zielobjekts <code>RealVideo</code> darin eine Video-Datei aus dem Web zu laden und abzuspielen. Das Laden des Videos findet im Konstruktor der Klasse <code>RealVideo</code> statt (Zeile 6). Das Abspielen startet bei Aufruf der Methode <code>play</code> (Zeilen 10-14). Das Interface <code>Video</code> schreibt nur diese Methode <code>play</code> vor, die auch von der Proxy-Klasse <code>ProxyVideo</code> implementiert wird. Die Proxy-Klasse verändert das Verhalten des Zielobjekts um zwei Aspekte:
<ul>
<li>Das Laden des Videos wird verzögert und findet nicht im Konstruktor sondern erst direkt vor dem Abspielen in der Methode <code>play</code> statt (Lazy Loading).</li>
<li>Das Laden des Videos wird verzögert und findet nicht im Konstruktor, sondern erst direkt vor dem Abspielen in der Methode <code>play</code> statt (Lazy Loading).</li>
<li>Videos, die kürzer sind als 30 Sek., werden gar nicht erst abgespielt, da es sich (in diesem Fall) um Werbung handelt.</li>
</ul></p>
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment