Robert.BrainUsers.net

Metoda szablonowa (Template method pattern) - behawioralny wzorzec projektowy

Metoda szablonowa rozwiązuje problem implementacji algorytmu, który działa w nie do końca znanym środowisku i przy nieustalonych parametrach. Zdarza się, że programista musi napisać część systemu, która ma działać według ściśle określonego schematu - jednakże musi być na tyle uniwersalna, aby szczegóły implementacji móc określić później w klasach dziedziczących. To tak jakby podać komuś przepis na ciasto, ale nie określając czy będzie z rodzynkami czy z kremem.

Nie kradnij, nie zabijaj, pisz uniwersalny kod

Projektowanie systemów informatycznych wymaga umiejętności abstrahowania od naiwnej formy pierwotnego algorytmu realizującego ustalone zadania przy znanych założeniach i przewidywania innych zastosowań danej części systemu. Projektantom oprogramowania zależy na tym, aby raz napisany kod dało się wykorzystywać wielokrotnie, jeśli zmienić niektóre założenia. A co jeśli w ogóle nie znamy szczegółów, które są niezbędne do implementacji algorytmu? Co jeżeli chcemy zachować uniwersalność algorytmu, nie określając z góry szczegółowych założeń?

Algorytm bez szczegółów

Z pomocą przychodzi gotowe rozwiązanie, przetestowany przez tysiące koderów na całym świecie wzorzec projektowy, jakim jestem Metoda szablonowa (ang. Template method). Pomysł polega na tym, aby stworzyć klasę abstrakcyjną (nie dająca się skonkretyzować), która zawiera w sobie publiczną metodę finalną, czyli taką której nie można przesłonić w podklasach. Metoda ta implementuje algorytm i jest niezmienna.

abstract class MyTemplate {
   final public boolean run() {
      if (this.getA() != 5) return false;
      else if (this.getB() == 9) return true;
      else return false;
   }
   abstract protected int getA();
   abstract protected int getB();
}

Chcąc odwołać się do szczegółów implementacji, które nie są znane na tym etapie projektowania, lub nie mogą zostać określone, by zachować uniwersalność rozwiązania, metoda finalna odwołuje się do pozostałych metod tej klasy. Metody te są za zwyczaj abstrakcyjne - określono tylko ich nazwy, argumenty i typy, ale nie określono ciała metody. Metoda abstrakcyjna musi zostać zaimplementowana w podklasie.

class MyClass extends MyTemplate {
   protected int getA() {
      return (int)System.Configuration.get('A');
   }
   protected int getB() {
      return (int)System.Database.query('SELECT B FROM table');
   }
}

W ten sposób każda klasa, która dziedziczy po szablonie, będzie realizowała z góry określony algorytm, ale implementacja metod abstrakcyjnych zapewni, że klasa będzie dostosowana do swojego środowiska lub zrealizuje szczegóły algorytmu za pomocą odmiennych procedur.

algorithm = new MyClass();
if (algorithm.run()) { ...

Algorytm sortowania

Dobrym przykładem jest dowolny algorytm sortowania. Nadaje się idealnie na szablon, nie określając jakie elementy będziemy sortować. Mogą to być zarówno skalary jak i całe tablice oraz obiekty. Procedura porównania w algorytmie sortowania może przebiegać dzięki porównaniu pól obiektu, lub poprzez skomplikowane obliczenia wielu właściwości obu obiektów.

Open Source

Innym przykładem zastosowania metody szablonowej jest pisanie kodu Open Source. Chcemy, aby wielu developerów skorzystało z naszego oprogramowania, ale nie możemy dostarczyć im gotowego modułu, bo nie znamy wszystkich systemów docelowych lub jest ich po prostu zbyt dużo. Możemy natomiast ulżyć tym programistom i napisać większość procedur jako metodę szablonową, pozostawiając szczegółowe, lecz bardzo proste metody do implementacji przez developera dla konkretnego przypadku zastosowania. W ten sposób stworzymy klasę, którą można wykorzystać w wielu (często nieznanych) środowiskach. Przykładem może być napisanie klasy, która stworzy kanał RSS. Zasada działania jest prosta: na wyjściu musimy otrzymać plik XML w ustalonym formacie. Szczegóły implementacji, takie jak dostęp do źródła danych dla kanału (np. bazy danych) zostawiamy developerom, którzy wdrożą rozwiązanie u siebie.

Komentarze

Na razie brak komentarzy, Twój będzie pierwszy.

Dodaj komentarz