{"id":791,"date":"2022-12-11T19:47:00","date_gmt":"2022-12-11T18:47:00","guid":{"rendered":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/?p=791"},"modified":"2022-12-12T18:22:42","modified_gmt":"2022-12-12T17:22:42","slug":"wzorzec-dekorator","status":"publish","type":"post","link":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/2022\/12\/11\/wzorzec-dekorator\/","title":{"rendered":"Wzorzec Dekorator"},"content":{"rendered":"\n<p><strong>Wzorzec Dekorator<\/strong> jest jednym z podstawowych wzorc\u00f3w projektowych. Stosuj\u0105c wzorzec Dekorator mo\u017cemy dodawa\u0107 danemu obiektowi nowe zachowania. Wzorzec Dekorator stanowi doskona\u0142\u0105 alternatyw\u0119 dla dziedziczenia. Prac\u0119 ze wzorcem zaczynamy od utworzenie sk\u0142adnika podstawowego, do kt\u00f3rego b\u0119dziemy dodawa\u0107 nowe zachowania tzw. dekoratory.<\/p>\n\n\n\n<p>Ka\u017cdy z obiekt\u00f3w podstawowych mo\u017ce mie\u0107 dowoln\u0105 ilo\u015b\u0107 dekorator\u00f3w. Nale\u017cy pami\u0119ta\u0107, \u017ceby obiekty dekoruj\u0105ce by\u0142y tego samego typu co dekorowane. Obiekty mog\u0105 by\u0107 dekorowane w dowolnym momencie dzia\u0142ania programu.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"611\" height=\"498\" src=\"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/wp-content\/uploads\/2022\/12\/dekorator_uml-1.png\" alt=\"\" class=\"wp-image-818\" srcset=\"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/wp-content\/uploads\/2022\/12\/dekorator_uml-1.png 611w, https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/wp-content\/uploads\/2022\/12\/dekorator_uml-1-300x245.png 300w\" sizes=\"auto, (max-width: 611px) 100vw, 611px\" \/><figcaption class=\"wp-element-caption\">Rys 1. Diagram UML &#8211; wzorzec Dekorator.<\/figcaption><\/figure>\n\n\n\n<p>Spr\u00f3bujmy zastosowa\u0107 wzorzec Dekorator na przyk\u0142adzie. Za\u0142\u00f3\u017cmy, \u017ce prowadzimy bar z kanapkami, kt\u00f3ry ma cztery sta\u0142e kanapki w ofercie: z szynk\u0105, serem, kurczakiem i wege. Do ka\u017cdej z tych kanapek mo\u017cemy doda\u0107 dodatkowe sk\u0142adniki takie jak np: jajko, pomidor, og\u00f3rek, cebula, sos itd. Im wi\u0119cej sk\u0142adnik\u00f3w, tym wi\u0119cej r\u00f3\u017cnych wariant\u00f3w kanapek mo\u017cemy uzyska\u0107. Bez zastosowania wzorca Dekorator trzeba by stworzy\u0107 oddzieln\u0105 klas\u0105 z ka\u017cdym wariantem dziedzicz\u0105cym po klasie abstrakcyjnej \u201eKanapka\u201d. Takie rozwi\u0105zania prowadzi do szybkiej \u201eeksplozji klas\u201d.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"779\" height=\"455\" src=\"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/wp-content\/uploads\/2022\/12\/dekorator_uml_bez-1.png\" alt=\"\" class=\"wp-image-819\" srcset=\"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/wp-content\/uploads\/2022\/12\/dekorator_uml_bez-1.png 779w, https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/wp-content\/uploads\/2022\/12\/dekorator_uml_bez-1-300x175.png 300w, https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/wp-content\/uploads\/2022\/12\/dekorator_uml_bez-1-768x449.png 768w\" sizes=\"auto, (max-width: 779px) 100vw, 779px\" \/><figcaption class=\"wp-element-caption\">Rys 2. Diagram UML &#8211; przyk\u0142ad bez zastosowania wzorca.<\/figcaption><\/figure>\n\n\n\n<p>Po zastosowaniu wzorca Dekorator diagram UML wygl\u0105da\u0142by nast\u0119puj\u0105co:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"952\" height=\"404\" src=\"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/wp-content\/uploads\/2022\/12\/dekorator_uml_wzorzec-1.png\" alt=\"\" class=\"wp-image-821\" srcset=\"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/wp-content\/uploads\/2022\/12\/dekorator_uml_wzorzec-1.png 952w, https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/wp-content\/uploads\/2022\/12\/dekorator_uml_wzorzec-1-300x127.png 300w, https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/wp-content\/uploads\/2022\/12\/dekorator_uml_wzorzec-1-768x326.png 768w\" sizes=\"auto, (max-width: 952px) 100vw, 952px\" \/><figcaption class=\"wp-element-caption\">Rys 3. Diagram UML &#8211; zastosowanie wzorca Dekorator na przyk\u0142adzie.<\/figcaption><\/figure>\n\n\n\n<p>Kod z u\u017cyciem wzorca Dekorator jest jasny i przejrzysty. Z \u0142atwo\u015bci\u0105 mo\u017cemy doda\u0107 nowe dodatki, bez ingerencji w istniej\u0105cy ju\u017c kod oraz dowolnie dekorowa\u0107 podstawowe wersje kanapek dodatkowymi elementami. Stw\u00f3rzmy kanapk\u0119 z kurczakiem, pomidorem i jajkiem i obliczmy jej koszt.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public abstract class Kanapka {\n    String opis = \"Kanapka nieznana\";\n\n    public String pobierzOpis(){\n        return opis;\n    }\n    public abstract double obliczCene();\n}\npublic class KanapkaZKurczakiem extends Kanapka{\n\n    public KanapkaZKurczakiem(){\n        opis = \"Kanapka z kurczakiem\";\n    }\n\n    @Override\n    public double obliczCene() {\n        return 7.50;\n    }\n}\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>public abstract class SkladnikDekorator extends Kanapka{\n    public abstract String pobierzOpis();\n}\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>public class Pomidor extends SkladnikDekorator{\n    Kanapka kanapka;\n\n    public Pomidor(Kanapka kanapka){\n        this.kanapka = kanapka;\n    }\n\n    @Override\n    public double obliczCene() {\n        return kanapka.obliczCene() + 0.70;\n    }\n\n    @Override\n    public String pobierzOpis() {\n        return kanapka.pobierzOpis() + \" + pomidor\";\n    }\n}\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>public class Jajko extends SkladnikDekorator{\n    Kanapka kanapka;\n\n    public Jajko(Kanapka kanapka){\n        this.kanapka = kanapka;\n    }\n\n    @Override\n    public double obliczCene() {\n        return kanapka.obliczCene() + 1.50;\n    }\n\n    @Override\n    public String pobierzOpis() {\n        return kanapka.pobierzOpis() + \" + jajko\";\n    }\n}\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>public class Main {\n    public static void main(String&#91;] args) {\n        Kanapka kanapka1 = new KanapkaZKurczakiem();\n        kanapka1 = new Jajko(kanapka1);\n        kanapka1 = new Pomidor(kanapka1);\n        System.out.println(kanapka1.pobierzOpis() + \", koszt kanapki: \" + kanapka1.obliczCene());\n    }\n}\n<\/code><\/pre>\n\n\n\n<p>Wykonuj\u0105c powy\u017cszy kod dostaniemy w odpowiedzi: Kanapka z kurczakiem + jajko + pomidor, koszt kanapki: 9.7.<\/p>\n\n\n<div class=\"has-text-align-right wp-block-post-date\"><time datetime=\"2022-12-11T19:47:00+01:00\">2022-12-11<\/time><\/div>","protected":false},"excerpt":{"rendered":"<p>Wzorzec Dekorator jest jednym z podstawowych wzorc\u00f3w projektowych. Stosuj\u0105c wzorzec Dekorator mo\u017cemy dodawa\u0107 danemu obiektowi nowe zachowania. Wzorzec Dekorator stanowi doskona\u0142\u0105 alternatyw\u0119 dla dziedziczenia. Prac\u0119 ze wzorcem zaczynamy od utworzenie sk\u0142adnika podstawowego, do kt\u00f3rego b\u0119dziemy dodawa\u0107 nowe zachowania tzw. dekoratory. Ka\u017cdy z obiekt\u00f3w podstawowych mo\u017ce mie\u0107 dowoln\u0105 ilo\u015b\u0107 dekorator\u00f3w. Nale\u017cy pami\u0119ta\u0107, \u017ceby obiekty dekoruj\u0105ce by\u0142y &hellip;<\/p>\n<p class=\"read-more\"> <a class=\"\" href=\"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/2022\/12\/11\/wzorzec-dekorator\/\"> <span class=\"screen-reader-text\">Wzorzec Dekorator<\/span> Read More &raquo;<\/a><\/p>\n","protected":false},"author":1,"featured_media":824,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"default","ast-global-header-display":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","footnotes":""},"categories":[13],"tags":[],"class_list":["post-791","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-wzorce-projektowe"],"_links":{"self":[{"href":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/posts\/791","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/comments?post=791"}],"version-history":[{"count":7,"href":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/posts\/791\/revisions"}],"predecessor-version":[{"id":843,"href":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/posts\/791\/revisions\/843"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/media\/824"}],"wp:attachment":[{"href":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/media?parent=791"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/categories?post=791"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/tags?post=791"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}