{"id":827,"date":"2022-12-11T20:49:26","date_gmt":"2022-12-11T19:49:26","guid":{"rendered":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/?p=827"},"modified":"2022-12-12T18:16:22","modified_gmt":"2022-12-12T17:16:22","slug":"wzorzec-metoda-szablonowa","status":"publish","type":"post","link":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/2022\/12\/11\/wzorzec-metoda-szablonowa\/","title":{"rendered":"Wzorzec Metoda Szablonowa"},"content":{"rendered":"\n<p><strong>Metoda Szablonowa<\/strong> jest wzorcem, za pomoc\u0105 kt\u00f3rego mo\u017cemy zdefiniowa\u0107 szablon algorytmu. Poszczeg\u00f3lne kroki algorytmu w szablonie s\u0105 definiowane jako oddzielne metody. Metody mog\u0105 by\u0107 obs\u0142ugiwane zar\u00f3wno przez klas\u0119, w kt\u00f3rej zawiera si\u0119 metoda szablonowa, jak i przez klasy podrz\u0119dne. Metody, kt\u00f3re maj\u0105 by\u0107 implementowane przez klasy podrz\u0119dne, s\u0105 metodami abstrakcyjnymi. Klasy podrz\u0119dne maj\u0105 mo\u017cliwo\u015b\u0107 redefiniowania poszczeg\u00f3lnych krok\u00f3w algorytmu, jednak nie mog\u0105 zmienia\u0107 jego struktury. Zalet\u0105 Metody Szablonowej jest zlokalizowanie algorytmu w jednym miejscu, co wp\u0142ywa na \u0142atwiejsze wprowadzanie potencjalnych zmian w kodzie.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"486\" height=\"335\" src=\"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/wp-content\/uploads\/2022\/12\/szablonowa_uml.png\" alt=\"\" class=\"wp-image-828\" srcset=\"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/wp-content\/uploads\/2022\/12\/szablonowa_uml.png 486w, https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/wp-content\/uploads\/2022\/12\/szablonowa_uml-300x207.png 300w\" sizes=\"auto, (max-width: 486px) 100vw, 486px\" \/><figcaption class=\"wp-element-caption\">Rys 1. Diagram UML &#8211; wzorzec Metoda Szablonowa.<\/figcaption><\/figure>\n\n\n\n<p>W KlasieAbstrakcyjnej mo\u017cemy stosowa\u0107 r\u00f3wnie\u017c tzw. \u201ehaczyki\u201d \u2013 metody rzeczywiste, kt\u00f3re nic nie robi\u0105, posiadaj\u0105 pust\u0105 lub domy\u015bln\u0105 implementacj\u0119. W zale\u017cno\u015bci od potrzeb, klasy podrz\u0119dne mog\u0105 przes\u0142oni\u0107 t\u0105 metod\u0119 lub j\u0105 zignorowa\u0107.<\/p>\n\n\n\n<p>U\u017cyjmy wzorca na przyk\u0142adzie. Za\u0142\u00f3\u017cmy, \u017ce chcemy napisa\u0107 kod pokazuj\u0105cy kroki post\u0119powania przy wykonywaniu element\u00f3w \u017celbetowych na budowie, np. \u015bcian i strop\u00f3w. Na pocz\u0105tku sp\u00f3jrzmy na stworzone klasy bez u\u017cycia wzorca:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public class Sciana {\n    private String nazwa = \"\u015bciana\";\n\n    void wykonajElement(){\n        deskowanie();\n        zbrojenie();\n        betonowanie();\n        piel\u0119gnacja();\n    }\n\n    public void deskowanie(){\n        System.out.println(\"Deskowanie ramowe\");\n    }\n\n    public void zbrojenie(){\n        System.out.println(\"Pr\u0119ty zbrojeniowe fi=8mm\");\n    }\n\n    public void betonowanie(){\n        System.out.println(\"Betonowanie elementu: \" + nazwa);\n    }\n\n    public void piel\u0119gnacja(){\n        System.out.println(\"Piel\u0119gnacja betonu\");\n    }\n}\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>public class Strop {\n    private String nazwa = \"strop\";\n\n    void wykonajElement(){\n        deskowanie();\n        zbrojenie();\n        betonowanie();\n        piel\u0119gnacja();\n    }\n\n    public void deskowanie(){\n        System.out.println(\"Deskowanie d\u017awigarkowe\");\n    }\n\n    public void zbrojenie(){\n        System.out.println(\"Pr\u0119ty zbrojeniowe fi=12mm\");\n    }\n\n    public void betonowanie(){\n        System.out.println(\"Betonowanie elementu: \" + nazwa);\n    }\n\n    public void piel\u0119gnacja(){\n        System.out.println(\"Piel\u0119gnacja betonu\");\n    }\n}\n<\/code><\/pre>\n\n\n\n<p>Takie rozwi\u0105zanie prowadzi do kopiowania kodu. Do tego przyk\u0142adu doskonale sprawdzi si\u0119 omawiany wzorzec Metoda Szablonowa.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"496\" height=\"359\" src=\"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/wp-content\/uploads\/2022\/12\/szablonowa_uml_zelb.png\" alt=\"\" class=\"wp-image-829\" srcset=\"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/wp-content\/uploads\/2022\/12\/szablonowa_uml_zelb.png 496w, https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/wp-content\/uploads\/2022\/12\/szablonowa_uml_zelb-300x217.png 300w\" sizes=\"auto, (max-width: 496px) 100vw, 496px\" \/><figcaption class=\"wp-element-caption\">Rys 2. Diagram UML &#8211; zastosowanie wzorca Metoda Szablonowa na przyk\u0142adzie.<\/figcaption><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>public abstract class ElementZelbetowy {\n    String nazwa;\n\n    final void wykonajElement(){\n        deskowanie();\n        zbrojenie();\n        betonowanie();\n        piel\u0119gnacja();\n    }\n    abstract void deskowanie();\n\n    abstract void zbrojenie();\n\n    public void betonowanie(){\n        System.out.println(\"Betonowanie elementu: \" + pobierzNazwa());\n    }\n\n    public void piel\u0119gnacja(){\n        System.out.println(\"Piel\u0119gnacja betonu\");\n    }\n\n    public String pobierzNazwa(){\n        return nazwa;\n    }\n}\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>public class Sciana extends ElementZelbetowy{\n\n    public Sciana(){\n        nazwa = \"\u015bciana\";\n    }\n\n    @Override\n    void deskowanie() {\n        System.out.println(\"Deskowanie ramowe\");\n    }\n\n    @Override\n    void zbrojenie() {\n        System.out.println(\"Pr\u0119ty zbrojeniowe fi=8mm\");\n    }\n}\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>public class Strop extends ElementZelbetowy{\n\n    public Strop(){\n        nazwa = \"strop\";\n    }\n\n    @Override\n    void deskowanie() {\n        System.out.println(\"Deskowanie d\u017awigarkowe\");\n    }\n\n    @Override\n    void zbrojenie() {\n        System.out.println(\"Pr\u0119ty zbrojeniowe fi=12mm\");\n    }\n}\n<\/code><\/pre>\n\n\n\n<p>Element\u017belbetowy jest klas\u0105 abstrakcyjn\u0105, po kt\u00f3rej dziedzicz\u0105 klasy rzeczywiste \u2013 \u015aciana i Strop. W tym przyk\u0142adzie Metod\u0105 Szablonow\u0105 jest metoda wykonaj element, kt\u00f3ra zawiera algorytm, w jaki spos\u00f3b wykonywa\u0107 element \u017celbetowy. Dzi\u0119ki zastosowaniu wzorca z \u0142atwo\u015bci\u0105 mo\u017cemy dodawa\u0107 nowe elementy np. s\u0142up, belka itp.<\/p>\n\n\n<div class=\"has-text-align-right wp-block-post-date\"><time datetime=\"2022-12-11T20:49:26+01:00\">2022-12-11<\/time><\/div>","protected":false},"excerpt":{"rendered":"<p>Metoda Szablonowa jest wzorcem, za pomoc\u0105 kt\u00f3rego mo\u017cemy zdefiniowa\u0107 szablon algorytmu. Poszczeg\u00f3lne kroki algorytmu w szablonie s\u0105 definiowane jako oddzielne metody. Metody mog\u0105 by\u0107 obs\u0142ugiwane zar\u00f3wno przez klas\u0119, w kt\u00f3rej zawiera si\u0119 metoda szablonowa, jak i przez klasy podrz\u0119dne. Metody, kt\u00f3re maj\u0105 by\u0107 implementowane przez klasy podrz\u0119dne, s\u0105 metodami abstrakcyjnymi. Klasy podrz\u0119dne maj\u0105 mo\u017cliwo\u015b\u0107 redefiniowania &hellip;<\/p>\n<p class=\"read-more\"> <a class=\"\" href=\"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/2022\/12\/11\/wzorzec-metoda-szablonowa\/\"> <span class=\"screen-reader-text\">Wzorzec Metoda Szablonowa<\/span> Read More &raquo;<\/a><\/p>\n","protected":false},"author":1,"featured_media":830,"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-827","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\/827","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=827"}],"version-history":[{"count":5,"href":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/posts\/827\/revisions"}],"predecessor-version":[{"id":839,"href":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/posts\/827\/revisions\/839"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/media\/830"}],"wp:attachment":[{"href":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/media?parent=827"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/categories?post=827"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/tags?post=827"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}