{"id":367,"date":"2024-04-30T18:17:11","date_gmt":"2024-04-30T17:17:11","guid":{"rendered":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=367"},"modified":"2024-06-03T18:20:57","modified_gmt":"2024-06-03T17:20:57","slug":"das-proxy-design-pattern-in-java","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=367","title":{"rendered":"Das Proxy-Design-Pattern in Java"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Einleitung<\/h2>\n\n\n\n<p>Das Proxy-Design-Pattern geh\u00f6rt zu den strukturellen Design-Patterns und wird verwendet, um den Zugriff auf ein Objekt zu steuern, indem ein Stellvertreter (Proxy) eingef\u00fchrt wird. Ein Proxy agiert als Vermittler f\u00fcr ein anderes Objekt und bietet eine zus\u00e4tzliche Ebene der Abstraktion und Kontrolle. Dieses Pattern ist besonders n\u00fctzlich, wenn direkte Zugriffe auf das Zielobjekt aus Gr\u00fcnden der Leistungsoptimierung, Sicherheit, Zugriffskontrolle oder Nachverfolgbarkeit nicht w\u00fcnschenswert sind.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Grundlegendes Konzept<\/h2>\n\n\n\n<p>Ein Proxy ist eine Klasse, die die gleiche Schnittstelle wie das Zielobjekt implementiert. Dadurch kann der Proxy als Ersatz f\u00fcr das echte Objekt fungieren und Operationen an das Zielobjekt weiterleiten, ggf. unter Hinzuf\u00fcgung eigener Logik. Es gibt mehrere Arten von Proxies, darunter der Schutzproxy, der Remote-Proxy, der Virtual-Proxy und der Cache-Proxy. Jeder dieser Proxies hat eine spezifische Aufgabe und wird in unterschiedlichen Szenarien eingesetzt.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Struktur des Proxy-Design-Patterns<\/h2>\n\n\n\n<p>Das Proxy-Design-Pattern besteht aus folgenden Hauptkomponenten:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Subject (Subjekt)<\/strong>: Dies ist eine Schnittstelle oder abstrakte Klasse, die sowohl vom RealSubject als auch vom Proxy implementiert wird. Sie deklariert die gemeinsamen Methoden.<\/li>\n\n\n\n<li><strong>RealSubject (Reales Subjekt)<\/strong>: Dies ist die eigentliche Klasse, die die wesentliche Gesch\u00e4ftslogik implementiert.<\/li>\n\n\n\n<li><strong>Proxy<\/strong>: Diese Klasse implementiert die gleiche Schnittstelle wie das RealSubject und enth\u00e4lt eine Referenz auf ein RealSubject. Der Proxy steuert den Zugriff auf das RealSubject.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Klassendiagramm<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">+--------------------+        +------------------+\n|     Subject        |&lt;-------|      Proxy       |\n+--------------------+        +------------------+\n| +operation()       |        | +operation()     |\n+--------------------+        +--------+---------+\n                              | -realSubject     |\n                              +--------+---------+\n                                       |\n                                       |\n                                       v\n                              +--------+---------+\n                              |    RealSubject   |\n                              +------------------+\n                              | +operation()     |\n                              +------------------+<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Beispielimplementierung in Java<\/h2>\n\n\n\n<p>Hier ein Beispiel, um das Proxy-Design-Pattern in Java zu veranschaulichen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Schritt 1: Definition der Subject-Schnittstelle<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface<\/span> <span class=\"hljs-title\">Subject<\/span> <\/span>{\n    void request();\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Schritt 2: Implementierung der RealSubject-Klasse<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">RealSubject<\/span> <span class=\"hljs-keyword\">implements<\/span> <span class=\"hljs-title\">Subject<\/span> <\/span>{\n    @Override\n    <span class=\"hljs-keyword\">public<\/span> void request() {\n        System.out.println(<span class=\"hljs-string\">\"RealSubject: Handling request.\"<\/span>);\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Schritt 3: Implementierung der Proxy-Klasse<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Proxy<\/span> <span class=\"hljs-keyword\">implements<\/span> <span class=\"hljs-title\">Subject<\/span> <\/span>{\n    <span class=\"hljs-keyword\">private<\/span> RealSubject realSubject;\n\n    @Override\n    <span class=\"hljs-keyword\">public<\/span> void request() {\n        <span class=\"hljs-keyword\">if<\/span> (realSubject == <span class=\"hljs-keyword\">null<\/span>) {\n            realSubject = <span class=\"hljs-keyword\">new<\/span> RealSubject();\n        }\n        System.out.println(<span class=\"hljs-string\">\"Proxy: Delegating request to RealSubject.\"<\/span>);\n        realSubject.request();\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Schritt 4: Nutzung des Proxies<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">public <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Client<\/span> <\/span>{\n    public <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> main(<span class=\"hljs-built_in\">String<\/span>&#91;] args) {\n        Subject proxy = <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-built_in\">Proxy<\/span>();\n        proxy.request();\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In diesem Beispiel kontrolliert der Proxy den Zugriff auf das RealSubject, indem er die Instanziierung des RealSubject verz\u00f6gert, bis es tats\u00e4chlich ben\u00f6tigt wird. Dies ist ein Beispiel f\u00fcr einen Virtual-Proxy.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Varianten des Proxy-Patterns<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Schutz-Proxy<\/h3>\n\n\n\n<p>Ein Schutz-Proxy kontrolliert den Zugriff basierend auf Berechtigungen des Benutzers. Dies ist besonders n\u00fctzlich in sicherheitskritischen Anwendungen.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ProtectionProxy<\/span> <span class=\"hljs-keyword\">implements<\/span> <span class=\"hljs-title\">Subject<\/span> <\/span>{\n    <span class=\"hljs-keyword\">private<\/span> RealSubject realSubject;\n    <span class=\"hljs-keyword\">private<\/span> String role;\n\n    <span class=\"hljs-keyword\">public<\/span> ProtectionProxy(String role) {\n        this.role = role;\n    }\n\n    @Override\n    <span class=\"hljs-keyword\">public<\/span> void request() {\n        <span class=\"hljs-keyword\">if<\/span> (<span class=\"hljs-string\">\"ADMIN\"<\/span>.equals(role)) {\n            <span class=\"hljs-keyword\">if<\/span> (realSubject == <span class=\"hljs-keyword\">null<\/span>) {\n                realSubject = <span class=\"hljs-keyword\">new<\/span> RealSubject();\n            }\n            realSubject.request();\n        } <span class=\"hljs-keyword\">else<\/span> {\n            System.out.println(<span class=\"hljs-string\">\"ProtectionProxy: Access denied.\"<\/span>);\n        }\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Remote-Proxy<\/h3>\n\n\n\n<p>Ein Remote-Proxy kapselt den Zugriff auf ein Objekt, das sich in einem anderen Adressraum befindet, beispielsweise auf einem entfernten Server.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Cache-Proxy<\/h3>\n\n\n\n<p>Ein Cache-Proxy speichert die Ergebnisse von h\u00e4ufigen Anfragen zwischen, um teure Zugriffe zu minimieren.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Vorteile des Proxy-Patterns<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Trennung von Anliegen<\/strong>: Es erm\u00f6glicht die Trennung von Zugriffssteuerungs- oder Optimierungslogik von der eigentlichen Gesch\u00e4ftslogik.<\/li>\n\n\n\n<li><strong>Leistungsoptimierung<\/strong>: Ein Virtual-Proxy kann die Erstellung ressourcenintensiver Objekte verz\u00f6gern.<\/li>\n\n\n\n<li><strong>Sicherheit<\/strong>: Ein Schutz-Proxy kann unbefugten Zugriff verhindern.<\/li>\n\n\n\n<li><strong>Transparenz<\/strong>: Die Verwendung eines Proxies ist f\u00fcr den Client transparent, da beide die gleiche Schnittstelle implementieren.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Nachteile des Proxy-Patterns<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Komplexit\u00e4t<\/strong>: Die Einf\u00fchrung eines Proxies kann die Struktur des Codes komplizierter machen.<\/li>\n\n\n\n<li><strong>Leistungsoverhead<\/strong>: Der zus\u00e4tzliche Abstraktionsschicht kann einen kleinen Performance-Overhead verursachen.<\/li>\n\n\n\n<li><strong>Wartungsaufwand<\/strong>: Die Verwaltung zus\u00e4tzlicher Klassen und Schnittstellen kann den Wartungsaufwand erh\u00f6hen.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Fazit<\/h2>\n\n\n\n<p>Das Proxy-Design-Pattern ist ein vielseitiges und m\u00e4chtiges Muster, das in vielen verschiedenen Szenarien n\u00fctzlich sein kann. Es bietet eine zus\u00e4tzliche Ebene der Kontrolle und Flexibilit\u00e4t, die oft in gro\u00dfen, komplexen Systemen ben\u00f6tigt wird. Durch das Verst\u00e4ndnis und die richtige Anwendung des Proxy-Patterns k\u00f6nnen Entwickler Systeme entwerfen, die besser strukturiert, sicherer und effizienter sind.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Einleitung Das Proxy-Design-Pattern geh\u00f6rt zu den strukturellen Design-Patterns und wird verwendet, um den Zugriff auf ein Objekt zu steuern, indem ein Stellvertreter (Proxy) eingef\u00fchrt wird. Ein Proxy agiert als Vermittler f\u00fcr ein anderes Objekt und bietet eine zus\u00e4tzliche Ebene der Abstraktion und Kontrolle. Dieses Pattern ist besonders n\u00fctzlich, wenn direkte Zugriffe auf das Zielobjekt aus [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-367","post","type-post","status-publish","format-standard","hentry","category-plain_java"],"_links":{"self":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/367","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=367"}],"version-history":[{"count":1,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/367\/revisions"}],"predecessor-version":[{"id":368,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/367\/revisions\/368"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=367"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=367"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=367"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}