{"id":365,"date":"2024-04-29T18:15:59","date_gmt":"2024-04-29T17:15:59","guid":{"rendered":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=365"},"modified":"2024-06-03T18:17:10","modified_gmt":"2024-06-03T17:17:10","slug":"das-adapter-design-pattern-in-java","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=365","title":{"rendered":"Das Adapter-Design-Pattern in Java"},"content":{"rendered":"\n<p>Das Adapter-Design-Pattern ist ein strukturelles Designmuster, das verwendet wird, um die Schnittstelle einer Klasse in eine andere Schnittstelle umzuwandeln, die der Client erwartet. Es erm\u00f6glicht die Zusammenarbeit von Klassen, die aufgrund inkompatibler Schnittstellen normalerweise nicht zusammenarbeiten k\u00f6nnten. In der Softwareentwicklung wird das Adapter-Pattern h\u00e4ufig eingesetzt, um die Wiederverwendbarkeit von Code zu erh\u00f6hen und die Integration von Alt- und Neusystemen zu erleichtern.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Grundlagen des Adapter-Design-Patterns<\/h2>\n\n\n\n<p>Das Adapter-Design-Pattern wird in zwei Hauptvarianten implementiert: dem Klassenadapter und dem Objektadapter.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Klassenadapter<\/h3>\n\n\n\n<p>Der Klassenadapter verwendet Vererbung, um die Schnittstellen anzupassen. Dies bedeutet, dass der Adapter von beiden Klassen erbt: der Zielklasse und der anzupassenden Klasse. Da Java keine Mehrfachvererbung unterst\u00fctzt, ist diese Variante in Java nicht direkt umsetzbar.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Objektadapter<\/h3>\n\n\n\n<p>Der Objektadapter verwendet Komposition, um die Schnittstellen anzupassen. Der Adapter enth\u00e4lt eine Instanz der anzupassenden Klasse und implementiert die Schnittstelle der Zielklasse. Diese Methode ist in Java weit verbreitet, da sie die Beschr\u00e4nkungen der Klassenadapter umgeht.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Implementierung eines Adapters in Java<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Beispielproblem<\/h3>\n\n\n\n<p>Angenommen, wir haben ein bestehendes System, das mit der Schnittstelle <code>Rectangle<\/code> arbeitet, und eine neue Bibliothek, die eine Klasse <code>LegacyRectangle<\/code> mit einer leicht abweichenden Schnittstelle bereitstellt. Unser Ziel ist es, <code>LegacyRectangle<\/code> so zu adaptieren, dass es als <code>Rectangle<\/code> verwendet werden kann.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Die Zielschnittstelle<\/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\">Rectangle<\/span> <\/span>{\n    void draw(int x, int y, int width, int height);\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\">Die anzupassende 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\">LegacyRectangle<\/span> <\/span>{\n    <span class=\"hljs-keyword\">public<\/span> void draw(int x1, int y1, int x2, int y2) {\n        System.out.println(<span class=\"hljs-string\">\"Rectangle from (\"<\/span> + x1 + <span class=\"hljs-string\">\",\"<\/span> + y1 + <span class=\"hljs-string\">\") to (\"<\/span> + x2 + <span class=\"hljs-string\">\",\"<\/span> + y2 + <span class=\"hljs-string\">\")\"<\/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\">Der Adapter<\/h3>\n\n\n\n<p>Der Adapter implementiert die <code>Rectangle<\/code>-Schnittstelle und enth\u00e4lt eine Instanz von <code>LegacyRectangle<\/code>. Die Methode <code>draw<\/code> der Zielschnittstelle wird so implementiert, dass sie die Methode <code>draw<\/code> der anzupassenden Klasse aufruft und die Parameter entsprechend umwandelt.<\/p>\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\">RectangleAdapter<\/span> <span class=\"hljs-keyword\">implements<\/span> <span class=\"hljs-title\">Rectangle<\/span> <\/span>{\n    <span class=\"hljs-keyword\">private<\/span> LegacyRectangle legacyRectangle;\n\n    <span class=\"hljs-keyword\">public<\/span> RectangleAdapter(LegacyRectangle legacyRectangle) {\n        this.legacyRectangle = legacyRectangle;\n    }\n\n    @Override\n    <span class=\"hljs-keyword\">public<\/span> void draw(int x, int y, int width, int height) {\n        int x1 = x;\n        int y1 = y;\n        int x2 = x + width;\n        int y2 = y + height;\n        legacyRectangle.draw(x1, y1, x2, y2);\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\">Nutzung des Adapters<\/h3>\n\n\n\n<p>Nun k\u00f6nnen wir den Adapter verwenden, um Instanzen von <code>LegacyRectangle<\/code> als <code>Rectangle<\/code> zu behandeln.<\/p>\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\">AdapterPatternDemo<\/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        LegacyRectangle legacyRectangle = <span class=\"hljs-keyword\">new<\/span> LegacyRectangle();\n        Rectangle rectangle = <span class=\"hljs-keyword\">new<\/span> RectangleAdapter(legacyRectangle);\n\n        rectangle.draw(<span class=\"hljs-number\">10<\/span>, <span class=\"hljs-number\">20<\/span>, <span class=\"hljs-number\">30<\/span>, <span class=\"hljs-number\">40<\/span>);\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>Ausgabe:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Rectangle <span class=\"hljs-keyword\">from<\/span> (<span class=\"hljs-number\">10<\/span>,<span class=\"hljs-number\">20<\/span>) to (<span class=\"hljs-number\">40<\/span>,<span class=\"hljs-number\">60<\/span>)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><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<h2 class=\"wp-block-heading\">Vorteile des Adapter-Patterns<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Wiederverwendbarkeit<\/strong>: Vorhandene Klassen k\u00f6nnen in neuen Kontexten wiederverwendet werden, ohne dass deren Quellcode ge\u00e4ndert werden muss.<\/li>\n\n\n\n<li><strong>Flexibilit\u00e4t<\/strong>: Neue Adapter k\u00f6nnen erstellt werden, um neue oder unterschiedliche Schnittstellen zu unterst\u00fctzen, ohne bestehende Codebasis zu beeinflussen.<\/li>\n\n\n\n<li><strong>Einfache Integration<\/strong>: Es erleichtert die Integration von Fremdbibliotheken oder Altcode in moderne Systeme.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Nachteile des Adapter-Patterns<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Komplexit\u00e4t<\/strong>: Kann die Komplexit\u00e4t des Codes erh\u00f6hen, insbesondere wenn viele Adapter ben\u00f6tigt werden.<\/li>\n\n\n\n<li><strong>Leistung<\/strong>: Zus\u00e4tzliche Indirektion durch Adapter kann die Leistung beeintr\u00e4chtigen, obwohl dies in den meisten Anwendungsf\u00e4llen vernachl\u00e4ssigbar ist.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Praktische Anwendungsf\u00e4lle<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Nutzung von Fremdbibliotheken<\/h3>\n\n\n\n<p>Eine der h\u00e4ufigsten Anwendungen des Adapter-Patterns ist die Nutzung von Fremdbibliotheken, deren Schnittstellen nicht direkt mit den eigenen Anforderungen \u00fcbereinstimmen. Der Adapter erm\u00f6glicht es, diese Bibliotheken zu integrieren, ohne deren Code zu ver\u00e4ndern.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Vereinheitlichung unterschiedlicher Schnittstellen<\/h3>\n\n\n\n<p>In einem gro\u00dfen System k\u00f6nnen verschiedene Module mit unterschiedlichen Schnittstellen existieren. Adapter k\u00f6nnen verwendet werden, um eine einheitliche Schnittstelle bereitzustellen, die von anderen Teilen des Systems verwendet werden kann.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u00dcbergang zu neuen Systemen<\/h3>\n\n\n\n<p>Beim \u00dcbergang von einem alten System zu einem neuen kann das Adapter-Pattern helfen, die Kompatibilit\u00e4t zu wahren, indem es die alte Schnittstelle auf die neue abbildet.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Best Practices<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Klare Benennung<\/strong>: Adapter sollten so benannt werden, dass ihre Funktion offensichtlich ist, z.B. <code>LegacyRectangleAdapter<\/code>.<\/li>\n\n\n\n<li><strong>Minimalistisches Design<\/strong>: Adapter sollten so einfach wie m\u00f6glich gehalten werden, um ihre Wartbarkeit zu gew\u00e4hrleisten.<\/li>\n\n\n\n<li><strong>Dokumentation<\/strong>: Eine gute Dokumentation der Adapter ist wichtig, um deren Nutzung und Zweck klar zu vermitteln.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Fazit<\/h2>\n\n\n\n<p>Das Adapter-Design-Pattern ist ein m\u00e4chtiges Werkzeug in der Softwareentwicklung, das die Integration und Wiederverwendbarkeit von Komponenten verbessert. Durch die Anpassung von Schnittstellen erm\u00f6glicht es die Zusammenarbeit von Klassen, die ansonsten inkompatibel w\u00e4ren. In Java wird das Objektadapter-Pattern h\u00e4ufig verwendet, da es die Beschr\u00e4nkungen der Klassenadapter umgeht und eine flexible, wartbare L\u00f6sung bietet. Ob beim \u00dcbergang zu neuen Systemen, der Nutzung von Fremdbibliotheken oder der Vereinheitlichung unterschiedlicher Schnittstellen \u2013 das Adapter-Pattern erweist sich als \u00e4u\u00dferst n\u00fctzlich und sollte im Werkzeugkasten eines jeden Softwareentwicklers nicht fehlen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Das Adapter-Design-Pattern ist ein strukturelles Designmuster, das verwendet wird, um die Schnittstelle einer Klasse in eine andere Schnittstelle umzuwandeln, die der Client erwartet. Es erm\u00f6glicht die Zusammenarbeit von Klassen, die aufgrund inkompatibler Schnittstellen normalerweise nicht zusammenarbeiten k\u00f6nnten. In der Softwareentwicklung wird das Adapter-Pattern h\u00e4ufig eingesetzt, um die Wiederverwendbarkeit von Code zu erh\u00f6hen und die Integration [&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-365","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\/365","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=365"}],"version-history":[{"count":1,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/365\/revisions"}],"predecessor-version":[{"id":366,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/365\/revisions\/366"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=365"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=365"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=365"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}