Wzorce projektowe: Metoda szablonowa(Template method)

Cześć wszystkim!! Po kilku miesiącach znów jestem! 😃😎🙂 Miałem wiele innych zajęć. Dzisiaj jest o wzorcu znanym jako metoda szablonowa. Jest dużo do opisania, ale o tym jest dalej w poście. 🙂

 

Wstęp

Nie było mnie przez długi czas, ale prawdopodobnie potrzebowałem odpoczynku. Jest dużo do powiedzenia, na przykład w niedalekiej przyszłości będę prowadził własną firmę z branży IT, rozmawiałem z kilkoma osobami o kilku pomysłach na aplikacje mobilne i mamy kilku znajomych inwestorów, więc mam nadzieję, że to będzie sukces 🙂, ale zobaczymy, wciąż jest na to dużo czasu 🙂. Już dość o mnie, jak widzisz, miałem dużo zajęć. Wróćmy do tematu, dziś jest temat o wzorcu zwanym metoda szablonowa, który w skrócie jest używany jako szkielet programu. Trochę czuję się jak Arnold 😂😂

 

Dyskusja

Wzorzec projektowy składa się w skrócie z co najmniej dwóch klas. W klasie AbstractClass jest zdefiniowany szkielet algorytmu i to z niej korzysta klient, są tam metody, które są abstrakcyjne, więc są zmienne i możemy zmieniać ich zachowanie w każdej klasie, która dziedziczy po klasie AbstractClass, są też metody, które mają już zdefiniowaną logikę, czyli są niezmienne, nie można zmieniać ich zachowania. I wszystkie te metody są wywoływane w metodzie templateMethod(), która również jest zdefiniowana w klasie AbstractClass.

Wzorzec metoda szablonowa(template method) jest wykorzystywana bardzo często w  różnych frameworkach. Jeśli ktoś zauważył związek wzorca template method z zasadą Odwrócenia zależności(Inversion of Control) to gratuluje spostrzegawczości 🙂 Zauważ, że klasa AbstractClass jest, można powiedzieć klasą frameworka jest w niej zdefiniowana logika i z niej korzysta klient, oraz kod w tej klasie wywołuje kod klienta, czyli jest zgodna z zasadą Hollywood pokazaną na obrazku poniżej.

 

Cel

  • Zdefiniowanie szkieletu algorytmu.
  • Oddzielenie części logiki do klas dziedziczących po klasie AbstractClass(klasie bazowej) bez zmieniania podstawowej struktury algorytmu.
  • Zaimplementowanie niezmiennej części algorytmu.

 

Problem

Utworzyłeś jakąś część kodu, który ciężko rozszerzać a chcesz żeby ten kod był łatwy do modyfikwania, lub masz jakiś kod, który ma dużo podobieństw, ale również definiuje wspólne implementacje lub interfejsy, których nie da się użyć. We wszystkich tych przypadkach warto użyć wzorca template method 🙂

 

Użyj wtedy kiedy:

  • Chcesz np mieć program, który będzie otwarty na rozszerzenia, ale zamknięty na modyfikacje, czyli w skrócie znaczy, że chcesz mieć kawałek programu, który będzie rozszerzalny bez zmieniania istniejącej logiki, czyli jak widać wzorzec template method stosuje również drugą zasadę solid open-closed 🙂
  • Tworzysz własny framework, którego będą używać inni ludzie, przekazując jakieś argumenty do niego i który będzie zwracał określoną odpowiedź.

 

Struktura

W tej sekcji standardowo pokażę, diagram UML wzorca template method:

template method scheme

Cały kod, który można ponownie wykorzystać znajduje się w klasie FrameworkClass a klasy, które rozbudowywują logikę frameworka to klasy ApplicationClassOne oraz ApplicationClassTwo.

Wzorzec template method jest również wykorzystywany w algorytmach sortujących, którego zasada implementacji jest opisana na diagramie poniżej:

template method scheme

Części logiki algorytmu sortującego jest niezmienialna, jak np metody sort() lub returnArray(), ponieważ one zawsze działają tak samo nie ma potrzeby nic w nich rozszerzać, jedynie metoda compare() jest rozszerzana żeby dodać logikę sortowania rosnąco oraz malejąco.

Zobaczmy teraz jak to wygląda przykładowo w kodzie, najpierw zobaczymy jak wygląda klasa AbstractClass czyli najważniejsza klasa we wzorcu:

Oraz zobaczmy klasy, które dziedziczą po klasie AbstractClass.

Widzimy, że metody abstrakcyjne, które są zdefiniowane w klasie AbstractClass jest dostosowywane do klas, które dziedziczą po klasie AbstractClass.

No i na końcu klient.

W kliencie wywołujemy metodę TemplateMethod(), która wywołuje wszystkie inne metody w klasie AbstractClass, widzimy zastosowanie zasady IoC to framework wywołuje metody klienta.

Wynik

template method scheme

 

Przykład

Przykładem metody szablonowej jest codzienna rutyna pracownika.

template method scheme

Widzimy tutaj, że niektóre czynności niektórych pracowników są takie same, inne nie. W tym przykładzie dobrze jest użyć metody szablonu. Zobaczmy, jak wygląda w kodzie. Zacznijmy od głównej klasy AbstractClass, w tym przykładzie jest to klasa Worker.

Ta klasa jest podobna do klasy AbstractClass z poprzedniego przykładu, ale ta klasa jest rozszerzona o niezmienne metody. GoToWork(), work(), returnToHome() reszta kodu jest podobna, jak w poprzednim przykładzie. Zakładamy, że wszyscy pracownicy idą do pracy, pracują i wracają do domu w tych samych godzinach, więc nie ma potrzeby, aby ta metoda była zmienna.

Zobaczmy teraz klasy FireFighter, Lumberjack, Postman i Manager.

Klasa FireFighter

Klasa Lumberjack

Klasa Postman

Klasa Manager

Jak widać, te klasy rozszerzają jedynie metody getUp(), eatBreakfast(), relax(), sleep(), każdy pracownik dopasowywuje pozostałe godziny aktywności do siebie.

I klasa klienta.

I wywołujemy metodę DailyRoutine() w każdej klasie.

Wynik

template method scheme

 

Przykład z życia wzięty

Prawdziwym przykładem może być generator dokumentów. W konsoli wykonamy generatory dokumentów HTML i XML. W kolejności jak w poprzednim przykładzie zacznijmy od głównej klasy, w tym przykładzie główną klasą jest klasa DocumentGenerator.

Nic nowego 🙂

Zobaczmy klasy, które rozszerzają metody generateHeader(), generateBody() i generateDetails().

Najpierw klasa HTMLDocGenerator

I klasa XMLDocGenerator

No i klient.

To jest prosty przykład, myślę, że nie ma co tłumaczyć 🙂 Jeśli się mylę, daj znać w komentarzach.

Wynik

template method scheme

 

Relacje z innymi wzorcami

  • Metoda szablonów używa dziedziczenia do zmiany części algorytmu. Strategia używa delegacji do zmiany całego algorytmu.
  • Strategia modyfikuje logikę poszczególnych obiektów. Metoda szablonowa modyfikuje logikę całej klasy.

 

Podsumowanie

I to wszystko na temat wzorca Metoda szablonowa(Template Method)🙂

Link do githuba ze wszystkimi przykładami: https://github.com/Slaw145/TemplateMethodTutorial

W następnym artykule, będzie mowa o wzorcu Obserwator(Observer).

Standardowo, przypominam o newsletterze, którym wysyłam powiadomienia o nowych wpisach oraz dodatkowe informacje na temat, ogółem mówiąc, świecie IT.

KONIECZNIE dołącz do społeczności DevmanCommunity na fb, części społeczności jest w jednym miejscu 🙂

-strona na fb: Devman.pl-Sławomir Kowalski

-grupa na fb: DevmanCommunity

Pytaj, komentuj pod spodem na końcu wpisu, podziel się nim, oceń go, rób co wolisz🙂

Teraz u mnie dużo się dzieje, więc wpisy będą mniej więcej co dwa, trzy tygodnie, na stronie na fb i na grupie mniej więcej co dwa. Wiadomości będe wysyłać newsletterem też mniej więcej co dwa tygodnie, tyle się dzieje, że ciężko przewidzieć kiedy dokładnie będe to robił. 🙂

Ilustracje, obrazki oraz diagramy są z: https://sourcemaking.com/design_patterns/template_method

 
Jeśli ten wpis ci się przydał podziel się nim ze swoimi znajomymi :)

Post a comment

Be first!

avatar
  Subscribe  
Notify about