Lekce 13 - Strategy (strategie)
V předchozím kvízu, Kvíz - Flyweight, Composite, Bridge, Observer ve Vzory GOF, jsme si ověřili nabyté zkušenosti z předchozích lekcí.
V dnešním tutoriálu Návrhové vzory GoF si představíme návrhový vzor Strategy, který umožňuje za běhu aplikace vyměnit algoritmus za jiný bez nutnosti změny kódu programu. Algoritmy jsou přehledně zabalené jako moduly. Jde o další návrhový vzor chování skupiny GoF.
Motivace použití vzoru Strategy
V aplikacích často používáme algoritmy například pro:
- výpočet slevy v internetovém obchodě,
- výpočet daně,
- uložení dat,
- validaci dat a podobně.
Algoritmů pro stejnou věc může být více. A to z důvodu kompatibility se staršími daty nebo jednoduše proto, že algoritmus závisí na konkrétní situaci.
Pokud bychom chtěli za běhu vyměnit algoritmus, budeme
muset bez znalosti Strategy nebo podobného vzoru implementovat
switch
či podobné větvení. To může být s narůstajícím
počtem algoritmů nepřehledné a každý nový algoritmus vyžaduje zásah do
zdrojového kódu. Občas bychom rádi, aby byl algoritmus jakýmsi
zapouzdřeným modulem. Ten by šel jednoduše vyměnit za
jiný, aniž by si toho klient všiml. Se vzorem Strategy můžeme takovou
změnu udělat dokonce i za běhu aplikace.
Specifikace vzoru Strategy
Vzor Strategy (strategie) je tvořen abstraktní třídou
Strategy
, která definuje rozhraní pro celou rodinu algoritmů. Ty
představují konkrétní strategie. Namísto abstraktní třídy se může
jednat i o rozhraní. Jednotlivé algoritmy z ní poté dědí a toto rozhraní
implementují svou logikou. Zde je UML diagram:
Instance algoritmu je vložena do instance třídy Kontext
často v konstruktoru, aby byl úplně odstíněn od jejího výběru.
Vzor Strategy je podobný vzoru Bridge, nicméně je určený pro chování, nikoli strukturu.
V další lekci, Template Method (šablonová metoda), si ukážeme návrhový vzor chování Template Method, který definuje kostru algoritmu. Potomci poté kroky implementují.