{"id":361,"date":"2024-04-26T18:13:31","date_gmt":"2024-04-26T17:13:31","guid":{"rendered":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=361"},"modified":"2024-06-03T18:14:37","modified_gmt":"2024-06-03T17:14:37","slug":"das-composite-design-pattern-in-java","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=361","title":{"rendered":"Das Composite-Design-Pattern in Java"},"content":{"rendered":"\n<h3 class=\"wp-block-heading\">Einf\u00fchrung<\/h3>\n\n\n\n<p>Das Composite-Design-Pattern ist ein Strukturmuster, das verwendet wird, um Objekte in Baumstrukturen zu organisieren und zu behandeln. Es erm\u00f6glicht die Handhabung einzelner Objekte und Zusammensetzungen von Objekten einheitlich. Dieses Muster ist besonders n\u00fctzlich, wenn ein Client sowohl einzelne Objekte als auch Gruppen von Objekten auf die gleiche Weise behandeln muss.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Motivation<\/h3>\n\n\n\n<p>Das Composite-Muster wird h\u00e4ufig in Situationen verwendet, in denen eine hierarchische Struktur von Objekten erstellt werden muss. Ein typisches Beispiel ist ein Dateisystem, in dem Dateien und Ordner beide eine gemeinsame Schnittstelle ben\u00f6tigen, um einheitlich behandelt zu werden. Ein Ordner kann sowohl Dateien als auch andere Ordner enthalten, und das Composite-Muster erm\u00f6glicht es, diese Komplexit\u00e4t zu abstrahieren und zu vereinfachen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Struktur<\/h3>\n\n\n\n<p>Das Composite-Muster besteht aus den folgenden Teilnehmern:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Komponente<\/strong>: Definiert die Schnittstelle f\u00fcr alle Objekte in der Komposition, sowohl f\u00fcr Bl\u00e4tter als auch f\u00fcr Zusammensetzungen.<\/li>\n\n\n\n<li><strong>Blatt<\/strong>: Stellt die Blattelemente der Komposition dar. Ein Blatt hat keine untergeordneten Objekte.<\/li>\n\n\n\n<li><strong>Kompositum<\/strong>: Definiert eine Komponente, die Kinder haben kann. Implementiert die Schnittstelle der Komponente und stellt Methoden zum Hinzuf\u00fcgen, Entfernen und Zugreifen auf die Kinder bereit.<\/li>\n\n\n\n<li><strong>Client<\/strong>: Verwendet die Komponentenschnittstelle, um mit den Objekten in der Komposition zu arbeiten.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Beispiel und Implementierung in Java<\/h3>\n\n\n\n<p>Lassen Sie uns das Composite-Design-Pattern in Java implementieren, indem wir ein Beispiel eines grafischen Editors betrachten. In diesem Beispiel k\u00f6nnen wir sowohl einfache grafische Objekte (wie Kreise und Rechtecke) als auch komplexe grafische Kompositionen (wie Gruppen von Objekten) haben.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Schritt 1: Definieren der Komponente<\/h4>\n\n\n\n<p>Zun\u00e4chst definieren wir die Komponente, die eine gemeinsame Schnittstelle f\u00fcr alle grafischen Objekte bereitstellt:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">interface GrafischesObjekt {\n    <span class=\"hljs-keyword\">void<\/span> zeichnen();\n    <span class=\"hljs-keyword\">void<\/span> add(GrafischesObjekt obj);\n    <span class=\"hljs-keyword\">void<\/span> remove(GrafischesObjekt obj);\n    GrafischesObjekt getChild(int i);\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><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<h4 class=\"wp-block-heading\">Schritt 2: Implementieren der Blattklasse<\/h4>\n\n\n\n<p>Jetzt implementieren wir die Blattklasse, die einfache grafische Objekte darstellt. Ein Kreis ist ein Beispiel f\u00fcr eine Blattklasse:<\/p>\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-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Kreis<\/span> <span class=\"hljs-keyword\">implements<\/span> <span class=\"hljs-title\">GrafischesObjekt<\/span> <\/span>{\n    <span class=\"hljs-keyword\">private<\/span> String name;\n\n    <span class=\"hljs-keyword\">public<\/span> Kreis(String name) {\n        this.name = name;\n    }\n\n    @Override\n    <span class=\"hljs-keyword\">public<\/span> void zeichnen() {\n        System.out.println(<span class=\"hljs-string\">\"Zeichne Kreis: \"<\/span> + name);\n    }\n\n    @Override\n    <span class=\"hljs-keyword\">public<\/span> void add(GrafischesObjekt obj) {\n        <span class=\"hljs-comment\">\/\/ Operation nicht unterst\u00fctzt<\/span>\n        <span class=\"hljs-keyword\">throw<\/span> <span class=\"hljs-keyword\">new<\/span> UnsupportedOperationException();\n    }\n\n    @Override\n    <span class=\"hljs-keyword\">public<\/span> void remove(GrafischesObjekt obj) {\n        <span class=\"hljs-comment\">\/\/ Operation nicht unterst\u00fctzt<\/span>\n        <span class=\"hljs-keyword\">throw<\/span> <span class=\"hljs-keyword\">new<\/span> UnsupportedOperationException();\n    }\n\n    @Override\n    <span class=\"hljs-keyword\">public<\/span> GrafischesObjekt getChild(int i) {\n        <span class=\"hljs-comment\">\/\/ Operation nicht unterst\u00fctzt<\/span>\n        <span class=\"hljs-keyword\">throw<\/span> <span class=\"hljs-keyword\">new<\/span> UnsupportedOperationException();\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<h4 class=\"wp-block-heading\">Schritt 3: Implementieren der Kompositumklasse<\/h4>\n\n\n\n<p>Als n\u00e4chstes implementieren wir die Kompositumklasse, die eine Gruppe von grafischen Objekten darstellt. Diese Klasse kann sowohl Kreise als auch andere Gruppen enthalten:<\/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\">import java.util.ArrayList;\nimport java.util.<span class=\"hljs-keyword\">List<\/span>;\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Gruppe<\/span> <span class=\"hljs-keyword\">implements<\/span> <span class=\"hljs-title\">GrafischesObjekt<\/span> <\/span>{\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">List<\/span>&lt;GrafischesObjekt&gt; kinder = <span class=\"hljs-keyword\">new<\/span> ArrayList&lt;&gt;();\n\n    @Override\n    <span class=\"hljs-keyword\">public<\/span> void zeichnen() {\n        <span class=\"hljs-keyword\">for<\/span> (GrafischesObjekt obj : kinder) {\n            obj.zeichnen();\n        }\n    }\n\n    @Override\n    <span class=\"hljs-keyword\">public<\/span> void add(GrafischesObjekt obj) {\n        kinder.add(obj);\n    }\n\n    @Override\n    <span class=\"hljs-keyword\">public<\/span> void remove(GrafischesObjekt obj) {\n        kinder.remove(obj);\n    }\n\n    @Override\n    <span class=\"hljs-keyword\">public<\/span> GrafischesObjekt getChild(int i) {\n        <span class=\"hljs-keyword\">return<\/span> kinder.get(i);\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<h4 class=\"wp-block-heading\">Schritt 4: Verwenden des Composite-Musters<\/h4>\n\n\n\n<p>Jetzt, da wir die Struktur eingerichtet haben, k\u00f6nnen wir das Composite-Muster verwenden, um eine hierarchische Struktur von grafischen Objekten zu erstellen und zu manipulieren:<\/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\">CompositePatternDemo<\/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        GrafischesObjekt kreis1 = <span class=\"hljs-keyword\">new<\/span> Kreis(<span class=\"hljs-string\">\"Kreis 1\"<\/span>);\n        GrafischesObjekt kreis2 = <span class=\"hljs-keyword\">new<\/span> Kreis(<span class=\"hljs-string\">\"Kreis 2\"<\/span>);\n\n        Gruppe gruppe = <span class=\"hljs-keyword\">new<\/span> Gruppe();\n        gruppe.add(kreis1);\n        gruppe.add(kreis2);\n\n        GrafischesObjekt kreis3 = <span class=\"hljs-keyword\">new<\/span> Kreis(<span class=\"hljs-string\">\"Kreis 3\"<\/span>);\n        Gruppe gruppe2 = <span class=\"hljs-keyword\">new<\/span> Gruppe();\n        gruppe2.add(gruppe);\n        gruppe2.add(kreis3);\n\n        System.out.println(<span class=\"hljs-string\">\"Zeichne Gruppe:\"<\/span>);\n        gruppe2.zeichnen();\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>Die Ausgabe dieses Programms wird sein:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Zeichne Gruppe:\nZeichne Kreis: Kreis 1\nZeichne Kreis: Kreis 2\nZeichne Kreis: Kreis 3<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Vorteile des Composite-Design-Patterns<\/h3>\n\n\n\n<p>Das Composite-Muster bietet mehrere Vorteile:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Einheitliche Behandlung<\/strong>: Es erm\u00f6glicht eine einheitliche Behandlung von einzelnen Objekten und Objektgruppen. Dies vereinfacht den Client-Code erheblich.<\/li>\n\n\n\n<li><strong>Erweiterbarkeit<\/strong>: Neue Arten von Komponenten k\u00f6nnen leicht hinzugef\u00fcgt werden, ohne vorhandenen Code zu \u00e4ndern.<\/li>\n\n\n\n<li><strong>Flexibilit\u00e4t<\/strong>: Die Struktur von Komponenten kann dynamisch zur Laufzeit ge\u00e4ndert werden, indem Objekte hinzugef\u00fcgt oder entfernt werden.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Nachteile des Composite-Design-Patterns<\/h3>\n\n\n\n<p>Trotz der Vorteile gibt es auch einige Nachteile:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Komplexit\u00e4t<\/strong>: Das Muster kann die Struktur und den Code komplexer machen, insbesondere wenn viele verschiedene Arten von Komponenten vorhanden sind.<\/li>\n\n\n\n<li><strong>Leistungsprobleme<\/strong>: Das Traversieren gro\u00dfer Baumstrukturen kann zu Leistungsproblemen f\u00fchren.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Fazit<\/h3>\n\n\n\n<p>Das Composite-Design-Pattern ist ein m\u00e4chtiges Werkzeug zur Verwaltung hierarchischer Strukturen von Objekten. Es erm\u00f6glicht eine einheitliche Behandlung von einfachen und zusammengesetzten Objekten und kann die Struktur von Anwendungen erheblich vereinfachen. Durch die Implementierung des Composite-Musters in Java haben wir gesehen, wie dieses Muster effektiv zur Erstellung flexibler und erweiterbarer Architekturen verwendet werden kann. Obgleich es auch Nachteile wie erh\u00f6hte Komplexit\u00e4t und m\u00f6gliche Leistungsprobleme gibt, \u00fcberwiegen die Vorteile in vielen Anwendungsf\u00e4llen, insbesondere wenn es darum geht, eine saubere und skalierbare L\u00f6sung f\u00fcr hierarchische Strukturen zu finden.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Einf\u00fchrung Das Composite-Design-Pattern ist ein Strukturmuster, das verwendet wird, um Objekte in Baumstrukturen zu organisieren und zu behandeln. Es erm\u00f6glicht die Handhabung einzelner Objekte und Zusammensetzungen von Objekten einheitlich. Dieses Muster ist besonders n\u00fctzlich, wenn ein Client sowohl einzelne Objekte als auch Gruppen von Objekten auf die gleiche Weise behandeln muss. Motivation Das Composite-Muster wird [&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-361","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\/361","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=361"}],"version-history":[{"count":1,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/361\/revisions"}],"predecessor-version":[{"id":362,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/361\/revisions\/362"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=361"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=361"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=361"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}