{"id":3938,"date":"2023-11-24T08:53:35","date_gmt":"2023-11-24T08:53:35","guid":{"rendered":"https:\/\/msgprogramator.sk\/?p=3938"},"modified":"2025-10-22T10:59:57","modified_gmt":"2025-10-22T10:59:57","slug":"java-decorator","status":"publish","type":"post","link":"https:\/\/msgprogramator.sk\/de\/java-decorator\/","title":{"rendered":"Java-Entwurfsmuster (design patterns): Decorator"},"content":{"rendered":"<p>Heute werfen wir einen Blick auf das n\u00e4chste <strong>Entwurfsmuster <\/strong> (Java <strong>design patterns<\/strong>) aus der Kategorie der strukturellen Muster (<strong>structural patterns<\/strong>) &#8211; Proxy. Entwurfsmuster in dieser Kategorie befassen sich mit Klassenstrukturen wie Vererbung (<strong>inheritance<\/strong>) und Komposition (<strong>composition<\/strong>).<\/p>\n<h2>Was ist das Entwurfsmuster Decorator?<\/h2>\n<p><strong>Decorator <\/strong> ist ein Entwurfsmuster, das verwendet wird, um bestehenden Objekten dynamisch neue Verantwortlichkeiten oder Funktionen hinzuzuf\u00fcgen (und zu entfernen), ohne das Verhalten anderer Objekte derselben Klasse zu beeinflussen. Das Hinzuf\u00fcgen neuer Funktionalit\u00e4t wird auch als Dekorieren bezeichnet, daher stammt der Name dieses Entwurfsmusters.<\/p>\n<h2>Was f\u00fcr ein Problem l\u00f6st das Entwurfsmuster Decorator?<\/h2>\n<p>Sie l\u00f6st das Problem der \u00c4nderung von Klasseninstanzen, ohne dass zus\u00e4tzliche abgeleitete Klassen erstellt werden m\u00fcssen, da sie die neue Funktionalit\u00e4t dynamisch an das Objekt anh\u00e4ngt. Die Verwendung dieses Musters kann viel effizienter sein als das Erstellen von Unterklassen, da das Verhalten eines Objekts erweitert werden kann, ohne ein komplett neues Objekt zu definieren. Es wird haupts\u00e4chlich verwendet, wenn wir ein Objekt erweitern m\u00fcssen (der Dekorierer erweitert nicht die Klasse).<\/p>\n<h2>Beispiel einer Decorator-Implementierung in Java<\/h2>\n<p>Wir werden nun ein Programm schreiben, das die Verwendung des Entwurfsmusters <strong>Decorator <\/strong> demonstriert, um dekorierte Eiscreme mit verschiedenen zus\u00e4tzlichen Zutaten zu erstellen.<\/p>\n<p>Das Interface <strong>IZmrzlina <\/strong> definiert die Methode <em>vyrobZmrzlinu()<\/em>, die von verschiedenen Eissorten implementiert wird.<\/p>\n<p><strong><u>IZmrzlina.java<\/u><\/strong><\/p>\n<pre><code class=\"language-java\" data-line=\"\">package designpatterns;\n\npublic interface IZmrzlina {\n    public String vyrobZmrzlinu();\n}\n<\/code><\/pre>\n<p>Die Klasse Zmrzlina implementiert das Interface <strong>IZmrzlina <\/strong> und bietet eine grundlegende Implementierung der Eiscreme.<\/p>\n<p><strong><u>Zmrzlina.java<\/u><\/strong><\/p>\n<pre><code class=\"language-java\" data-line=\"\">package designpatterns;\n\npublic class Zmrzlina implements IZmrzlina {\n    @Override\n    public String vyrobZmrzlinu() {\n        return &quot;Zmrzlina&quot;;\n    }\n}\n<\/code><\/pre>\n<p>Die abstrakte Klasse <strong>ZmrzlinaDecorator <\/strong> implementiert das Interface <strong>IZmrzlina <\/strong> und enth\u00e4lt eine Referenz auf eine Instanz von <strong>IZmrzlina<\/strong>, die dekoriert wird. Diese Klasse gibt das Ergebnis der Methode <em>vyrobZmrzlinu()<\/em> des dekorierten Eises zur\u00fcck.<\/p>\n<p><strong><u>ZmrzlinaDecorator.java<\/u><\/strong><\/p>\n<pre><code class=\"language-java\" data-line=\"\">package designpatterns;\n\nabstract class ZmrzlinaDecorator implements IZmrzlina {\n    protected IZmrzlina upravenaZmrzlina;\n\n    public ZmrzlinaDecorator(IZmrzlina upravenaZmrzlina) {\n        this.upravenaZmrzlina = upravenaZmrzlina;\n    }\n\n    @Override\n    public String vyrobZmrzlinu() {\n        return upravenaZmrzlina.vyrobZmrzlinu();\n    }\n}\n<\/code><\/pre>\n<p>Die Klasse <strong>CokoladaDecorator <\/strong> ist ein konkreter Dekorierer, der eine Schokoladenso\u00dfe zur Eiscreme hinzuf\u00fcgt. Diese Klasse ruft die Methode <em>vyrobZmrzlinu()<\/em> auf der Referenz zur Eiscreme auf und bedeckt sie mit Schokoladenso\u00dfe.<\/p>\n<p><strong><u>CokoladaDecorator.java<\/u><\/strong><\/p>\n<pre><code class=\"language-java\" data-line=\"\">package designpatterns;\n\npublic class CokoladaDecorator extends ZmrzlinaDecorator {\n\n        public CokoladaDecorator(IZmrzlina upravenaZmrzlina) {\n            super(upravenaZmrzlina);\n        }\n\n        public String vyrobZmrzlinu() {\n            return upravenaZmrzlina.vyrobZmrzlinu() + pridajCokoladu();\n        }\n\n        private String pridajCokoladu() {\n            return &quot;, poliata cokoladovou polevou&quot;;\n        }\n}\n<\/code><\/pre>\n<p>Die Klasse <strong>ArasidyDecorator <\/strong> ist ein weiterer konkreter Dekorierer, der zersto\u00dfene Erdn\u00fcsse zur Eiscreme hinzuf\u00fcgt. \u00c4hnlich wie der <strong>CokoladaDecorator <\/strong> ruft diese Klasse die Methode <em>vyrobZmrzlinu()<\/em> auf der Referenz zur Eiscreme auf und bestreut sie mit zersto\u00dfenen Erdn\u00fcssen.<\/p>\n<p><strong><u>ArasidyDecorator.java<\/u><\/strong><\/p>\n<pre><code class=\"language-java\" data-line=\"\">package designpatterns;\n\npublic class ArasidyDecorator extends ZmrzlinaDecorator {\n\n        public ArasidyDecorator(IZmrzlina upravenaZmrzlina) {\n            super(upravenaZmrzlina);\n        }\n\n        public String vyrobZmrzlinu() {\n            return upravenaZmrzlina.vyrobZmrzlinu() + pridajArasidy();\n        }\n\n        private String pridajArasidy() {\n            return &quot;, posypana drvenymi arasidami&quot;;\n        }\n}\n<\/code><\/pre>\n<p>In der Methode <em>main()<\/em> erstellen wir ein konkretes Eisobjekt mit einer Sequenz von Dekorationen. Wir beginnen mit der urspr\u00fcnglichen Eiscreme <strong>(Zmrzlina)<\/strong>, f\u00fcgen zuerst die Schokoladenso\u00dfe <strong>(CokoladaDecorator)<\/strong> hinzu und anschlie\u00dfend die zersto\u00dfenen Erdn\u00fcsse <strong> (ArasidyDecorator)<\/strong>.<\/p>\n<p><strong><u>Main.java<\/u><\/strong><\/p>\n<pre><code class=\"language-java\" data-line=\"\">import designpatterns.*;\n\npublic class Main {\n    public static void main(String[] args) {\n        IZmrzlina zmrzlina = new ArasidyDecorator(new CokoladaDecorator(new Zmrzlina()));\n        System.out.println(zmrzlina.vyrobZmrzlinu());\n    }\n}\n<\/code><\/pre>\n<p>Dekoratoren k\u00f6nnen in beliebiger Reihenfolge kombiniert werden. Diese Flexibilit\u00e4t und dynamische \u00c4nderung des Instanzverhaltens zur Laufzeit ist ein grundlegender Vorteil des Entwurfsmusters <strong>Decorator<\/strong>.<\/p>\n<figure id=\"attachment_1608\" aria-describedby=\"caption-attachment-1608\" style=\"width: 640px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-1608 size-large\" src=\"https:\/\/msgprogramator.sk\/wp-content\/uploads\/2023\/11\/vystup-z-prikladu-1500-300-1024x205.webp\" alt=\"Dekoratoren k\u00f6nnen in beliebiger Reihenfolge kombiniert werden. Diese Flexibilit\u00e4t und dynamische \u00c4nderung des Instanzverhaltens zur Laufzeit ist ein grundlegender Vorteil des Entwurfsmusters Decorator.\" width=\"640\" height=\"128\"><figcaption id=\"caption-attachment-1608\" class=\"wp-caption-text\">Ausgabe des Beispiels f\u00fcr das Entwurfsmuster Decorator.<\/figcaption><\/figure>\n<h2>Zusammenfassung<\/h2>\n<p>Das Entwurfsmuster Decorator wird verwendet, wenn wir einer Schnittstelle dynamische Verantwortung hinzuf\u00fcgen m\u00fcssen, indem wir den urspr\u00fcnglichen Code einpacken. Wenn wir durch einfache Vererbung neue Funktionen hinzuf\u00fcgen w\u00fcrden, w\u00fcrden alle Objekte diese Funktionen erben, auch diejenigen, die sie nicht ben\u00f6tigen. Dies k\u00f6nnen wir vermeiden, indem wir dieses Muster verwenden.<\/p>\n<p>Wir haben die Dateien mit dem obigen Beispiel in Form von Code vorbereitet, den du direkt in Java ausf\u00fchren kannst. Lade den <a href=\"https:\/\/msgprogramator.sk\/wp-content\/uploads\/2023\/11\/Decorator.zip\">Java Code Decorator hier herunter.<\/a><\/p>\n<p>Beherrschst du die <a href=\"https:\/\/msgprogramator.sk\/java\/\">Programmiersprache Java<\/a>? Wenn du als <a href=\"https:\/\/msg-life.sk\/de\/stellenangebote\/java-entwickler-senior\/\"> Java Entwickler <\/a> auf der Suche nach einem Job bist, informiere dich \u00fcber unsere <a href=\"https:\/\/msg-life.sk\/de\/mitarbeiter-benefits\/\">Mitarbeiterbenefits <\/a> und reagiere auf unsere aktuellen <a href=\"https:\/\/msg-life.sk\/de\/stellenangebote\/\">Stellenangebote<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Was ist das Decorator-Designmuster und wof\u00fcr ist es gedacht? Lies unseren neuen Artikel und lade den Beispielcode herunter.<\/p>\n","protected":false},"author":14,"featured_media":3939,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[62],"tags":[],"class_list":["post-3938","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-java"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/msgprogramator.sk\/de\/wp-json\/wp\/v2\/posts\/3938","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/msgprogramator.sk\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/msgprogramator.sk\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/msgprogramator.sk\/de\/wp-json\/wp\/v2\/users\/14"}],"replies":[{"embeddable":true,"href":"https:\/\/msgprogramator.sk\/de\/wp-json\/wp\/v2\/comments?post=3938"}],"version-history":[{"count":8,"href":"https:\/\/msgprogramator.sk\/de\/wp-json\/wp\/v2\/posts\/3938\/revisions"}],"predecessor-version":[{"id":9328,"href":"https:\/\/msgprogramator.sk\/de\/wp-json\/wp\/v2\/posts\/3938\/revisions\/9328"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/msgprogramator.sk\/de\/wp-json\/wp\/v2\/media\/3939"}],"wp:attachment":[{"href":"https:\/\/msgprogramator.sk\/de\/wp-json\/wp\/v2\/media?parent=3938"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/msgprogramator.sk\/de\/wp-json\/wp\/v2\/categories?post=3938"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/msgprogramator.sk\/de\/wp-json\/wp\/v2\/tags?post=3938"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}