Blog
Blog HelionBlog HelionBlog HelionBlog Helion
  • Artykuły
  • Autorzy
  • Recenzje
  • Konkursy

Wzorce projektowe – Template method

    Blog.helion.pl Artykuły Wzorce projektowe – Template method
    NastępnyPoprzedni

    Wzorce projektowe – Template method

    By Jerzy Piechowiak | Artykuły, Programowanie | Brak komentarzy | 20 października, 2016 | 2

    Kilka razy spotkałem się z opinią, że wzorce projektowe są pewnym uzupełnieniem języków programowania, ponieważ realizują zadania, które powinny być dostępne out of the box. Trudno polemizować z takim stwierdzeniem w przypadku singletona czy factory method, ale istnieje spora grupa wzorców projektowych, które trudno byłoby po prostu zaimplementować bezpośrednio w języku. 

     

    Do takiej grupy z pewnością należy zaklasyfikować template method, który po polsku nazywamy metodą szablonową. Template method zaliczamy do zespołu tzw. wzorców zachowań.

     

    Idea wzorca

    Template method jest w moim odczuciu jednym z najprostszych wzorców projektowych — bardzo łatwo jest go zastosować, nawet nie zdając sobie z tego sprawy. Podczas tworzenia różnorakich fragmentów kodu często zdarza nam się dojść do sytuacji, w której uzyskujemy zbliżone do siebie klasy, różniące się pewnymi detalami implementacyjnymi. W takiej sytuacji przed oczami staje nam całe spektrum wzorców oraz rozwiązań. Bardzo łatwo można poczuć się przytłoczonym.

     

    Przedstawiona powyżej sytuacja to duże pole do popisu dla template method. Wzorzec metody szablonowej wykorzystuje klasę abstrakcyjną do zaimplementowania lub utworzenia deklaracji wspólnych metod oraz swoistą metodę run, która w odpowiedniej kolejności wywołuje wszystkie metody pośrednie.

     

    W ten sposób tworzymy łańcuch wywołań, w którym w poszczególnych implementacjach możemy wymieniać składniki. Przykład zaprezentowano na diagramie.

     

     

    W klasie bazowej znajdują się metoda szablonowa oraz trzy metody cząstkowe. Klasy konkretne dziedziczą z klasy bazowej i jednocześnie implementują metodę nazwaną methodTwo, która różni się pomiędzy poszczególnymi implementacjami.

     

    Przykład praktyczny

    Wyobraźmy sobie, że tworzymy aplikację mobilną, która do generowania layoutu wykorzystuje klasy. Przy dostępnych obecnie kontrolkach oraz wykorzystaniu szeroko rozumianego layoutu adaptacyjnego istnieje spora szansa na podzielenie kodu layoutu w taki sposób, by częściowo reużyć tych samych jego fragmentów w wersji potrait oraz landscape. Jednocześnie oba widoki będą się składały z takich samych elementów.

     

    Poniżej kod klasy abstrakcyjnej — bazy dla obu layotuów:

     
    public abstract class LayoutBase
    {
    	protected virtual void RenderHeader()
    	{
    		Console.WriteLine("LayoutBase:RenderHeader()");
    	}
    
    	protected abstract void RenderBody();
    
    	protected virtual void RenderFooter()
    	{
    		Console.WriteLine("LayoutBase:RenderFooter()");
    	}
    
    	public void BuildLayout()
    	{
    		RenderHeader();
    		RenderBody();
    		RenderFooter();
    	}
    }
    

    Jak nietrudno zauważyć, metoda BuildLayout pełni funkcję metody szablonowej i wykorzystuje trzy metody podrzędne, z których dwie zostały już zdefiniowane, a trzecia powinna być zaimplementowana przez klasy konkretne. Warto również zwrócić uwagę na słowo kluczowe virtual. Zakładamy potencjalną zmienność dowolnego ze składników oraz stałość samej metody szablonowej.

     

    Poniżej implementacja dwóch klas konkretnych — po jednej dla każdego z layoutów:

     
    public class LayoutPortrait : LayoutBase
    {
    	protected override void RenderBody()
    	{
    		Console.WriteLine("LayoutPortrait:RenderBody()");
    	}
    }
    
    public class LayoutLandscape : LayoutBase
    {
    	protected override void RenderBody()
    	{
    		Console.WriteLine("LayoutLandscape:RenderBody()");
    	}
    }
    

    W obu przypadkach zaimplementowaliśmy abstrakcyjną metodę RenderBody, ale nic nie stało na przeszkodzie, by np. nadpisać również jeden ze składników. Wzorzec template method daje na tym polu sporą elastyczność.

     

    Zwieńczeniem przykładu jest testowa klasa Program:

     
    public class Program
    {
    	public static void Main(string[] args)
    	{
    		LayoutPortrait portrait = new LayoutPortrait();
    		portrait.BuildLayout();
    
    		LayoutLandscape landscape = new LayoutLandscape();
    		landscape.BuildLayout();
    
    		Console.Read();
    	}
    }
    

    Wynik jej działania w konsoli powinien być zgodny z oczekiwanym:
    LayoutBase:RenderHeader()
    LayoutPortrait:RenderBody()
    LayoutBase:RenderFooter()
    LayoutBase:RenderHeader()
    LayoutLandscape:RenderBody()
    LayoutBase:RenderFooter()

     

    Podsumowanie

    Wzorca template method — jak wszystkiego w życiu — warto używać z rozwagą. Zasadniczo jest on prostą receptą na rozwiązanie wielu problemów powtarzającego się kodu. Oczywiście należy znaleźć rozsądną granicę. Jeśli kod osiągnie kilkaset linii, a metoda szablonowa będzie się składać z 10 metod cząstkowych, to powinien być dla nas sygnał, że jednak coś tu nie do końca zagrało.

     

    Jerzy Piechowiak

    Altcontroldelete.pl

    c#, Jerzy Piechowiak, programowanie, template method, wzorce projektowe
    Avatar

    Jerzy Piechowiak

    Więcej postów od Jerzy Piechowiak

    Podobne posty

    • Wzorzec projektowy — metoda wytwórcza

      By Jerzy Piechowiak | Brak komentarzy

      Czasem mówi się, że wzorce projektowe uzupełniają braki techniczne w językach programowania. Jeśli spojrzymy na kilka popularnych wzorców, to szybko dostrzeżemy schemat. Wiele z nich krąży wokół szeroko rozumianego polimorfizmu.

    • Wzorzec projektowy singleton

      By Jerzy Piechowiak | Brak komentarzy

      Ze wzorcami projektowymi bywa różnie. Niektóre są bardzo przydatne, inne mniej, a jeszcze inne są pożądane tylko w określonych sytuacjach. Ogólnie bardzo łatwo wpaść w pułapkę nadużycia określonych rozwiązań. Taka sytuacja ma często miejsce wCzytaj więcej…

    • Wzorzec projektowy strategii

      By Jerzy Piechowiak | Brak komentarzy

      Programowanie, wbrew obiegowym opiniom, nie jest aż takie trudne. Wypuszczenie nawet prostych aplikacji mobilnych czy stron nie wymaga dzisiaj dużych nakładów sił. Największym problemem jest napisanie takiego kodu, który będzie łatwo rozszerzalny i będzie miałCzytaj więcej…

    • Wzorce projektowe — null object

      By Jerzy Piechowiak | Brak komentarzy

      „Object reference not set to an instance of an object” — taki, pojawiający się w najmniej oczekiwanym momencie komunikat to zmora każdego programisty C#. Przyczyna jest zawsze taka sama, a jest nią wyjątek NullReferenceException.

    • Ninject — ciekawa alternatywa dla Autofaca

      By Jerzy Piechowiak | Brak komentarzy

      W poprzednim poście starałem się przedstawić podstawowe różnice między trzema głównymi sposobami rejestracji usług dostępnymi w Autofacu. Kontener ten oferuje szerokie możliwości, dobre czasy „wyciągania” usług, ma także grono wiernych użytkowników. Jednak jeśli spojrzymy na statystykiCzytaj więcej…

    NastępnyPoprzedni

    Znajdź post

    Bądźmy w kontakcie

    Książka dnia

    Amazon Web Services. Podstawy korzystania z chmury AWS

    Autor: Mark Wilkins

    Cena: 44.50 zł 89.00 zł
    (Cena e-booka: 44.50 zł 89.00 zł)

    O 44,5zł taniej!

    kup teraz

    Ostatnie wpisy

    • Błyskawiczny kurs pisania skryptów powłoki
    • Przykładowa aplikacja webowa zaimplementowana w ASP .NET Core
    • Wprowadzenie do .NET Core: instalacja, konfiguracja, pierwsza aplikacja w systemie Linux
    • Grupa Helion zaprasza na szkolenia stacjonarne!
    • Hello World! Czym jest programowanie?

    Tagi

    .net agile altcontroldelete asp.net c# czysty kod debugowanie design patterns e-biznes emarketing Google Google Analytics hacking Jerzy Piechowiak kod kodowanie Krzysztof Marzec książka Maciej Dutko magazyn programista Magdalena Daniłoś marketing MVVM onepress organizacja czasu praca prograista programista programowanie prokrastynacja rafał kocisz reklama rozwój software craftsman SOLID startup techniki programowania testowanie video marketing visual studio WPF wzorce projektowe youtube zarządzanie czasem zarządzanie projektami

    Archiwum

    • lipiec 2017
    • czerwiec 2017
    • maj 2017
    • kwiecień 2017
    • marzec 2017
    • luty 2017
    • styczeń 2017
    • grudzień 2016
    • listopad 2016
    • październik 2016
    • wrzesień 2016
    • lipiec 2016
    • czerwiec 2016
    Blog wydawnictwa
    Informatyka w najlepszym wydaniu
    Strona wydawcy:
    www.helion.pl
    Księgarnia Helion.pl
    Nowości
    Bestsellery
    Promocje
    Bądźmy w kontakcie:
    Chcesz zostać autorem?
    Masz pytania do redakcji?
    Napisz do nas »
    • Artykuły
    • Autorzy
    • Recenzje
    • Konkursy
    Blog Helion