Lekce 14 - Template Method (šablonová metoda)
V minulé lekci, Strategy (strategie), jsme si probrali návrhový vzor Strategy, který umožňuje za běhu aplikace vyměnit algoritmus za jiný bez nutnosti změny kódu programu.
V dnešním tutoriálu Návrhové vzory GoF si představíme návrhový vzor chování Template Method, který definuje kostru algoritmu, tedy jeho jednotlivé kroky. Potomci poté kroky implementují a představují zaměnitelné algoritmy.
Motivace použití vzoru Template Method
V naší aplikaci se může objevit několik algoritmů se stejnou
strukturou, ale jiným chováním. Jako příklad se
často uvádí uložení dokumentu do souboru určitého formátu. Zapisovače
do souboru určitého typu mají odlišné chování. Ale všechny dokumenty
mají většinou stejnou strukturu (hlavička, tělo a patička). Všechny
zapisovací algoritmy se tedy skládají ze stejných primitivních operací
ZapisHlavicku()
, ZapisTelo()
a
ZapisPaticku()
. Právě toho využívá vzor Template Method.
Definice vzoru Template Method
Vzor Template Method zavádí kostru algoritmu pomocí metod, které symbolizují jeho jednotlivé kroky. Ty se nazývají primitivní operace a jedná se o metody abstraktní a privátní. Vzor je reprezentován abstraktní třídou, jejíž potomci poté implementují konkrétní algoritmy. Zde je UML diagram:

Algoritmy (konkrétní třídy) poté obsahují jednotné rozhraní,
například ZapisHlavicku()
, ZapisTelo()
a
ZapisPaticku()
, ale zmíněné kroky si provádí po svém.
Rozhraní je privátní a jeho volání provádí jedna veřejná metoda, která
je implementována v abstraktní třídě. V našem UML diagramu je označena
jako TemplateMethod()
. V praxi by se mohla jmenovat např.
Uloz()
. Metoda se potomky podědí, primitivní operace potomci
doimplementují. Problém se rozdělí do podproblémů, a tak se
zjednoduší.
Počet kroků by měl být co nejmenší a měly by být
označovány nějakým prefixem, například DoWriteHead()
.
Ačkoli se jedná o odlišné algoritmy, získáme jednotné rozhraní. To zpřehlední kód a usnadní další rozšiřování systému. Vzor Template Method je v podstatě podvzorem vzoru Strategy.
V další lekci, State, si ukážeme návrhový vzor State, který umožňuje objektu razantně změnit své chování, které je závislé na stavu tohoto objektu. Tento vzor nahrazuje složité větvení uvnitř objektu.