{"id":357,"date":"2024-04-24T18:07:59","date_gmt":"2024-04-24T17:07:59","guid":{"rendered":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=357"},"modified":"2024-06-03T18:09:33","modified_gmt":"2024-06-03T17:09:33","slug":"das-decorator-design-pattern-in-java","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=357","title":{"rendered":"Das Decorator-Design-Pattern in Java"},"content":{"rendered":"\n<p>Das Decorator-Design-Pattern ist ein strukturelles Muster, das es erm\u00f6glicht, das Verhalten von Objekten dynamisch zu erweitern oder zu \u00e4ndern, ohne deren Struktur zu ver\u00e4ndern. Dieses Muster geh\u00f6rt zur Kategorie der Strukturmuster und wird h\u00e4ufig in der objektorientierten Programmierung verwendet. In diesem Artikel werden wir das Decorator-Design-Pattern im Detail betrachten, seine Anwendungsm\u00f6glichkeiten in Java diskutieren und anhand eines praktischen Beispiels seine Implementierung veranschaulichen.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Grundlagen des Decorator-Design-Patterns<\/h4>\n\n\n\n<p>Das Decorator-Pattern erm\u00f6glicht es, einem Objekt neue Funktionalit\u00e4ten hinzuzuf\u00fcgen, indem es in dekorative Klassen eingebettet wird, die das gleiche Interface implementieren wie das dekorierte Objekt. Dies geschieht zur Laufzeit und nicht zur Kompilierzeit, was eine gro\u00dfe Flexibilit\u00e4t bei der Erweiterung der F\u00e4higkeiten eines Objekts bietet.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Struktur des Decorator-Patterns<\/h5>\n\n\n\n<p>Die Hauptbestandteile des Decorator-Patterns sind:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Component<\/strong>: Ein Interface oder eine abstrakte Klasse, die die grundlegenden Methoden definiert, die von konkreten Komponenten und Dekoratoren implementiert werden.<\/li>\n\n\n\n<li><strong>Concrete Component<\/strong>: Eine konkrete Implementierung des Component-Interfaces oder der abstrakten Klasse.<\/li>\n\n\n\n<li><strong>Decorator<\/strong>: Eine abstrakte Klasse, die das Component-Interface implementiert und eine Referenz auf ein Component-Objekt enth\u00e4lt. Diese Klasse delegiert die Aufrufe an das Component-Objekt und kann zus\u00e4tzliche Funktionalit\u00e4t hinzuf\u00fcgen.<\/li>\n\n\n\n<li><strong>Concrete Decorators<\/strong>: Klassen, die von der Decorator-Klasse erben und zus\u00e4tzliche Funktionalit\u00e4ten hinzuf\u00fcgen.<\/li>\n<\/ol>\n\n\n\n<h5 class=\"wp-block-heading\">Vorteile des Decorator-Patterns<\/h5>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Offene Erweiterung<\/strong>: Neue Funktionalit\u00e4ten k\u00f6nnen durch Hinzuf\u00fcgen neuer Dekoratoren implementiert werden, ohne den bestehenden Code zu \u00e4ndern.<\/li>\n\n\n\n<li><strong>Flexible Kombinationen<\/strong>: Verschiedene Dekoratoren k\u00f6nnen miteinander kombiniert werden, um komplexe Funktionalit\u00e4ten zu erzeugen.<\/li>\n\n\n\n<li><strong>Single Responsibility Principle<\/strong>: Jedes Dekorator-Objekt ist f\u00fcr eine spezifische Erweiterung verantwortlich, was den Code \u00fcbersichtlicher und wartbarer macht.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Implementierung in Java<\/h4>\n\n\n\n<p>Um das Decorator-Pattern in Java zu implementieren, betrachten wir ein einfaches Beispiel: Ein Textverarbeitungssystem, das verschiedene Arten von Textformatierungen unterst\u00fctzt. Wir beginnen mit dem Definieren der grundlegenden Struktur:<\/p>\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-comment\">\/\/ Component Interface<\/span>\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface<\/span> <span class=\"hljs-title\">Text<\/span> <\/span>{\n    String format();\n}\n\n<span class=\"hljs-comment\">\/\/ Concrete Component<\/span>\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">PlainText<\/span> <span class=\"hljs-keyword\">implements<\/span> <span class=\"hljs-title\">Text<\/span> <\/span>{\n    <span class=\"hljs-keyword\">private<\/span> String text;\n\n    <span class=\"hljs-keyword\">public<\/span> PlainText(String text) {\n        this.text = text;\n    }\n\n    @Override\n    <span class=\"hljs-keyword\">public<\/span> String format() {\n        <span class=\"hljs-keyword\">return<\/span> text;\n    }\n}\n\n<span class=\"hljs-comment\">\/\/ Decorator<\/span>\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">abstract<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">TextDecorator<\/span> <span class=\"hljs-keyword\">implements<\/span> <span class=\"hljs-title\">Text<\/span> <\/span>{\n    <span class=\"hljs-keyword\">protected<\/span> Text decoratedText;\n\n    <span class=\"hljs-keyword\">public<\/span> TextDecorator(Text decoratedText) {\n        this.decoratedText = decoratedText;\n    }\n\n    @Override\n    <span class=\"hljs-keyword\">public<\/span> String format() {\n        <span class=\"hljs-keyword\">return<\/span> decoratedText.format();\n    }\n}\n\n<span class=\"hljs-comment\">\/\/ Concrete Decorators<\/span>\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">BoldTextDecorator<\/span> <span class=\"hljs-keyword\">extends<\/span> <span class=\"hljs-title\">TextDecorator<\/span> <\/span>{\n    <span class=\"hljs-keyword\">public<\/span> BoldTextDecorator(Text decoratedText) {\n        super(decoratedText);\n    }\n\n    @Override\n    <span class=\"hljs-keyword\">public<\/span> String format() {\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-string\">\"&lt;b&gt;\"<\/span> + decoratedText.format() + <span class=\"hljs-string\">\"&lt;\/b&gt;\"<\/span>;\n    }\n}\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ItalicTextDecorator<\/span> <span class=\"hljs-keyword\">extends<\/span> <span class=\"hljs-title\">TextDecorator<\/span> <\/span>{\n    <span class=\"hljs-keyword\">public<\/span> ItalicTextDecorator(Text decoratedText) {\n        super(decoratedText);\n    }\n\n    @Override\n    <span class=\"hljs-keyword\">public<\/span> String format() {\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-string\">\"&lt;i&gt;\"<\/span> + decoratedText.format() + <span class=\"hljs-string\">\"&lt;\/i&gt;\"<\/span>;\n    }\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<p>In diesem Beispiel haben wir ein <code>Text<\/code>-Interface definiert, das eine <code>format<\/code>-Methode enth\u00e4lt. Die Klasse <code>PlainText<\/code> ist eine konkrete Implementierung dieses Interfaces und stellt einfachen Text dar. Die abstrakte Klasse <code>TextDecorator<\/code> implementiert ebenfalls das <code>Text<\/code>-Interface und enth\u00e4lt eine Referenz auf ein <code>Text<\/code>-Objekt, das dekoriert wird.<\/p>\n\n\n\n<p>Die konkreten Dekoratoren <code>BoldTextDecorator<\/code> und <code>ItalicTextDecorator<\/code> erben von <code>TextDecorator<\/code> und f\u00fcgen spezifische HTML-Tags hinzu, um den Text fett bzw. kursiv zu formatieren.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Anwendung des Decorator-Patterns<\/h5>\n\n\n\n<p>Nun, da wir die grundlegenden Klassen definiert haben, sehen wir uns an, wie wir das Decorator-Pattern verwenden k\u00f6nnen, um Texte zu formatieren:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" 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\">DecoratorPatternDemo<\/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        Text plainText = <span class=\"hljs-keyword\">new<\/span> PlainText(<span class=\"hljs-string\">\"Hello, World!\"<\/span>);\n        Text boldText = <span class=\"hljs-keyword\">new<\/span> BoldTextDecorator(plainText);\n        Text italicBoldText = <span class=\"hljs-keyword\">new<\/span> ItalicTextDecorator(boldText);\n\n        System.out.println(<span class=\"hljs-string\">\"Plain Text: \"<\/span> + plainText.format());\n        System.out.println(<span class=\"hljs-string\">\"Bold Text: \"<\/span> + boldText.format());\n        System.out.println(<span class=\"hljs-string\">\"Italic Bold Text: \"<\/span> + italicBoldText.format());\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\">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 Demo-Programm erstellen wir ein <code>PlainText<\/code>-Objekt und dekorieren es nacheinander mit den <code>BoldTextDecorator<\/code> und <code>ItalicTextDecorator<\/code>. Die Ausgabe zeigt, wie der Text schrittweise formatiert wird:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">Plain Text: Hello, World!\nBold Text: <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">b<\/span>&gt;<\/span>Hello, World!<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">b<\/span>&gt;<\/span>\nItalic Bold Text: <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">i<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">b<\/span>&gt;<\/span>Hello, World!<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">b<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">i<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h5 class=\"wp-block-heading\">Erweiterung des Beispiels<\/h5>\n\n\n\n<p>Um die Flexibilit\u00e4t des Decorator-Patterns weiter zu demonstrieren, f\u00fcgen wir einen weiteren Dekorator hinzu, der den Text unterstreicht:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" 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\">UnderlineTextDecorator<\/span> <span class=\"hljs-keyword\">extends<\/span> <span class=\"hljs-title\">TextDecorator<\/span> <\/span>{\n    <span class=\"hljs-keyword\">public<\/span> UnderlineTextDecorator(Text decoratedText) {\n        super(decoratedText);\n    }\n\n    @Override\n    <span class=\"hljs-keyword\">public<\/span> String format() {\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-string\">\"&lt;u&gt;\"<\/span> + decoratedText.format() + <span class=\"hljs-string\">\"&lt;\/u&gt;\"<\/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\">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<p>Jetzt k\u00f6nnen wir den Text zus\u00e4tzlich unterstreichen:<\/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\">public <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">DecoratorPatternDemo<\/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        Text plainText = <span class=\"hljs-keyword\">new<\/span> PlainText(<span class=\"hljs-string\">\"Hello, World!\"<\/span>);\n        Text boldText = <span class=\"hljs-keyword\">new<\/span> BoldTextDecorator(plainText);\n        Text italicBoldText = <span class=\"hljs-keyword\">new<\/span> ItalicTextDecorator(boldText);\n        Text underlineItalicBoldText = <span class=\"hljs-keyword\">new<\/span> UnderlineTextDecorator(italicBoldText);\n\n        System.out.println(<span class=\"hljs-string\">\"Plain Text: \"<\/span> + plainText.format());\n        System.out.println(<span class=\"hljs-string\">\"Bold Text: \"<\/span> + boldText.format());\n        System.out.println(<span class=\"hljs-string\">\"Italic Bold Text: \"<\/span> + italicBoldText.format());\n        System.out.println(<span class=\"hljs-string\">\"Underline Italic Bold Text: \"<\/span> + underlineItalicBoldText.format());\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\">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 zeigt nun den zus\u00e4tzlich unterstrichenen Text:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">Plain Text: Hello, World!\nBold Text: <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">b<\/span>&gt;<\/span>Hello, World!<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">b<\/span>&gt;<\/span>\nItalic Bold Text: <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">i<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">b<\/span>&gt;<\/span>Hello, World!<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">b<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">i<\/span>&gt;<\/span>\nUnderline Italic Bold Text: <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">u<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">i<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">b<\/span>&gt;<\/span>Hello, World!<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">b<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">i<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">u<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h4 class=\"wp-block-heading\">Fazit<\/h4>\n\n\n\n<p>Das Decorator-Design-Pattern ist ein m\u00e4chtiges Werkzeug in der objektorientierten Programmierung, das es erm\u00f6glicht, das Verhalten von Objekten zur Laufzeit zu erweitern, ohne ihre Struktur zu \u00e4ndern. Durch die Verwendung von Dekoratoren k\u00f6nnen Entwickler flexible und erweiterbare Systeme erstellen, die das Single Responsibility Principle befolgen und die Wiederverwendbarkeit des Codes f\u00f6rdern.<\/p>\n\n\n\n<p>In Java ist die Implementierung des Decorator-Patterns relativ einfach und besteht aus der Definition eines Component-Interfaces, einer konkreten Komponente und einer Reihe von Dekoratoren, die dieses Interface implementieren. Dieses Muster bietet eine saubere und strukturierte M\u00f6glichkeit, zus\u00e4tzliche Funktionalit\u00e4ten hinzuzuf\u00fcgen und die Wartbarkeit des Codes zu verbessern.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Das Decorator-Design-Pattern ist ein strukturelles Muster, das es erm\u00f6glicht, das Verhalten von Objekten dynamisch zu erweitern oder zu \u00e4ndern, ohne deren Struktur zu ver\u00e4ndern. Dieses Muster geh\u00f6rt zur Kategorie der Strukturmuster und wird h\u00e4ufig in der objektorientierten Programmierung verwendet. In diesem Artikel werden wir das Decorator-Design-Pattern im Detail betrachten, seine Anwendungsm\u00f6glichkeiten in Java diskutieren und [&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-357","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\/357","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=357"}],"version-history":[{"count":1,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/357\/revisions"}],"predecessor-version":[{"id":358,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/357\/revisions\/358"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=357"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=357"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=357"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}