{"id":216,"date":"2023-07-29T06:16:33","date_gmt":"2023-07-29T04:16:33","guid":{"rendered":"https:\/\/demosites.io\/rokophoto-gb\/?p=7"},"modified":"2023-12-27T21:33:01","modified_gmt":"2023-12-27T20:33:01","slug":"wzorzec-projektowy-strategia","status":"publish","type":"post","link":"https:\/\/karol-kowalski.profesjonalnyprogramista.pl\/?p=216","title":{"rendered":"Wzorzec projektowy strategia"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Strategia (ang. Strategy) jest wzorcem projektowym, kt\u00f3ry umo\u017cliwia elastyczne zarz\u0105dzanie algorytmami w trakcie dzia\u0142ania programu. W tym artykule om\u00f3wimy, dlaczego wzorzec Strategia jest przydatny, jak dzia\u0142a, oraz przedstawimy przyk\u0142ad jego implementacji.<\/p>\n\n\n\n<h2 id=\"wp-block-themeisle-blocks-advanced-heading-49ce53a0\" class=\"wp-block-themeisle-blocks-advanced-heading wp-block-themeisle-blocks-advanced-heading-49ce53a0\">Dlaczego Strategia?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">W projektowaniu oprogramowania cz\u0119sto spotykamy si\u0119 z sytuacjami, w kt\u00f3rych r\u00f3\u017cne cz\u0119\u015bci systemu wymagaj\u0105 r\u00f3\u017cnych algorytm\u00f3w. W takich przypadkach istotne jest, aby umo\u017cliwi\u0107 elastyczne prze\u0142\u0105czanie pomi\u0119dzy r\u00f3\u017cnymi strategiami bez konieczno\u015bci modyfikacji istniej\u0105cego kodu. Wzorzec Strategia pozwala na odseparowanie algorytm\u00f3w od reszty programu, co u\u0142atwia zarz\u0105dzanie nimi i wspiera zasad\u0119 otwarte\/zamkni\u0119te (Open\/Closed Principle) z SOLID.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Jak dzia\u0142a Strategia?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Wzorzec Strategia opiera si\u0119 na definiowaniu rodziny algorytm\u00f3w, umo\u017cliwiaj\u0105c obiektowi wyb\u00f3r jednego z nich w trakcie dzia\u0142ania programu. Kluczowym elementem tego wzorca s\u0105 trzy g\u0142\u00f3wne sk\u0142adniki:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Kontekst (Context):<\/strong> Jest to klasa, kt\u00f3ra posiada referencj\u0119 do jednego z obiekt\u00f3w strategii oraz udost\u0119pnia interfejs dla klient\u00f3w do korzystania z wybranego algorytmu.<\/li>\n\n\n\n<li><strong>Strategia (Strategy):<\/strong> Jest to interfejs lub abstrakcyjna klasa, kt\u00f3ra definiuje wsp\u00f3lny interfejs dla wszystkich konkret-nych algorytm\u00f3w.<\/li>\n\n\n\n<li><strong>Konkretne Strategie (Concrete Strategies):<\/strong> S\u0105 to klasy implementuj\u0105ce interfejs strategii, reprezentuj\u0105ce konkretne algorytmy.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Przyk\u0142ad Implementacji<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">W tym przyk\u0142adzie, <code>PaymentContext<\/code> to kontekst, kt\u00f3ry posiada referencj\u0119 do interfejsu <code>PaymentStrategy<\/code>. Klient, korzystaj\u0105c z <code>PaymentContext<\/code>, mo\u017ce \u0142atwo prze\u0142\u0105cza\u0107 pomi\u0119dzy r\u00f3\u017cnymi strategiami p\u0142atno\u015bci, co umo\u017cliwia elastyczne zarz\u0105dzanie procesem p\u0142atno\u015bci.<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:100%\">\n<pre class=\"wp-block-code\"><code>\/\/ Interfejs Strategii\ninterface PaymentStrategy {\n    void pay(int amount);\n}\n\n\/\/ Konkretne Strategie\nclass CreditCardPayment implements PaymentStrategy {\n    @Override\n    public void pay(int amount) {\n        System.out.println(\"Paying \" + amount + \" using credit card.\");\n        \/\/ Logika p\u0142atno\u015bci kart\u0105 kredytow\u0105\n    }\n}\n\nclass BankTransferPayment implements PaymentStrategy {\n    @Override\n    public void pay(int amount) {\n        System.out.println(\"Making a bank transfer of \" + amount + \".\");\n        \/\/ Logika przelewu bankowego\n    }\n}\n\nclass CashPayment implements PaymentStrategy {\n    @Override\n    public void pay(int amount) {\n        System.out.println(\"Paying \" + amount + \" in cash.\");\n        \/\/ Logika p\u0142atno\u015bci got\u00f3wk\u0105\n    }\n}\n\n\/\/ Kontekst\nclass PaymentContext {\n    private PaymentStrategy paymentStrategy;\n\n    public PaymentContext(PaymentStrategy paymentStrategy) {\n        this.paymentStrategy = paymentStrategy;\n    }\n\n    public void setPaymentStrategy(PaymentStrategy paymentStrategy) {\n        this.paymentStrategy = paymentStrategy;\n    }\n\n    public void processPayment(int amount) {\n        this.paymentStrategy.pay(amount);\n    }\n}\n\n\/\/ Klient\npublic class Client {\n    public static void main(String&#91;] args) {\n        \/\/ Utworzenie kontekstu p\u0142atno\u015bci z domy\u015bln\u0105 strategi\u0105\n        PaymentContext paymentContext = new PaymentContext(new CreditCardPayment());\n\n        \/\/ Realizacja p\u0142atno\u015bci r\u00f3\u017cnymi strategiami\n        paymentContext.processPayment(100);\n        \/\/ Zmiana strategii p\u0142atno\u015bci\n        paymentContext.setPaymentStrategy(new BankTransferPayment());\n        paymentContext.processPayment(200);\n        paymentContext.setPaymentStrategy(new CashPayment());\n        paymentContext.processPayment(50);\n    }\n}<\/code><\/pre>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Strategia (ang. Strategy) jest wzorcem projektowym, kt\u00f3ry umo\u017cliwia elastyczne zarz\u0105dzanie algorytmami w trakcie dzia\u0142ania programu. W tym artykule om\u00f3wimy, dlaczego wzorzec Strategia jest przydatny, jak dzia\u0142a, oraz przedstawimy przyk\u0142ad jego implementacji. W projektowaniu oprogramowania cz\u0119sto spotykamy si\u0119 z sytuacjami, w kt\u00f3rych r\u00f3\u017cne cz\u0119\u015bci systemu wymagaj\u0105 r\u00f3\u017cnych algorytm\u00f3w. W takich przypadkach istotne jest, aby umo\u017cliwi\u0107 elastyczne&hellip;&nbsp;<a href=\"https:\/\/karol-kowalski.profesjonalnyprogramista.pl\/?p=216\" class=\"\" rel=\"bookmark\">Czytaj dalej &raquo;<span class=\"screen-reader-text\">Wzorzec projektowy strategia<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":713,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"neve_meta_sidebar":"","neve_meta_container":"","neve_meta_enable_content_width":"","neve_meta_content_width":70,"neve_meta_title_alignment":"","neve_meta_author_avatar":"","neve_post_elements_order":"","neve_meta_disable_header":"","neve_meta_disable_footer":"","neve_meta_disable_title":"","_themeisle_gutenberg_block_has_review":false,"_ti_tpc_template_sync":false,"_ti_tpc_template_id":"","footnotes":""},"categories":[4],"tags":[],"class_list":["post-216","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/karol-kowalski.profesjonalnyprogramista.pl\/index.php?rest_route=\/wp\/v2\/posts\/216","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/karol-kowalski.profesjonalnyprogramista.pl\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/karol-kowalski.profesjonalnyprogramista.pl\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/karol-kowalski.profesjonalnyprogramista.pl\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/karol-kowalski.profesjonalnyprogramista.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=216"}],"version-history":[{"count":3,"href":"https:\/\/karol-kowalski.profesjonalnyprogramista.pl\/index.php?rest_route=\/wp\/v2\/posts\/216\/revisions"}],"predecessor-version":[{"id":706,"href":"https:\/\/karol-kowalski.profesjonalnyprogramista.pl\/index.php?rest_route=\/wp\/v2\/posts\/216\/revisions\/706"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/karol-kowalski.profesjonalnyprogramista.pl\/index.php?rest_route=\/wp\/v2\/media\/713"}],"wp:attachment":[{"href":"https:\/\/karol-kowalski.profesjonalnyprogramista.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=216"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/karol-kowalski.profesjonalnyprogramista.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=216"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/karol-kowalski.profesjonalnyprogramista.pl\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=216"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}