Návrhové vzory (design patterns) - diplomová práce M. Dvořáka


Strategy Pattern

SKUPINA: Behavioral Patterns

Problém

Určit rodinu algoritmů, zapouzdřit každý z nich do samostatného objektu a umožnit jejich záměnu. Řeší problém změny algoritmu nezávisle na klientovi, který jej využívá.

Podmínky

Základní podmínkou návrhového vzoru je předpoklad, že existuje více podobných řešení stejného problému. Tento návrhový vzor uvažuje o skupině algoritmů, které řeší stejnou funkčnost, ale rozdílným způsobem. Jestliže budou tyto algoritmy implementovány jako monolitický celek plný podmínek, snižuje se možnost jejich opětovného využití a dynamické změny algoritmu dle zvolené strategie.

Řešení

Poznámka: třída Strategy na obrázku dle návrhu GoF je abstraktní, v Javě či C# se obvykle používá rozhraní.

Context je objekt, s kterým komunikuje klient. Uchovává referenci na určitý Concrete Strategy objekt. Výběr správného objektu z množiny možných Concrete Strategy objektů, kterým má být zpracován požadavek do klienta, je možné buď na straně klienta, nebo tento výběr provádí Context. Při první možnosti, která je obvyklejší, je Concrete Strategy předáván Contextu jako parametr. Tím klient sám určuje strategii, jež bude uplatněna. V některých případech může rozhodnout i Context o nejlepší volbě strategie pro klienta.

Strategy představuje společné rozhraní, které musí být implementováno všemi použitými algoritmy. Context využívá tohoto rozhraní pro volání algoritmu definovaného v Concrete Strategy objektech, které představují rozdílnou implementaci stejného problému.

Obvyklý model chování tohoto návrhového vzoru, začíná určením strategie. Klient předá Contextu v parametru zvolený objekt Concrete Strategy. Klient komunikuje pouze s Contextem, který zprostředkovává volání mezi klientem a zvolenou strategií. Context může předat Concrete Strategy všechna data, která jsou nutná k výpočtu pomocí algoritmu. Druhou variantou je předání Concrete Strategy odkazu na Context. V tomto případě je vytvořeno ještě jedno rozhraní Contextu, které využívají Concrete Strategy objekty pro získání potřebných dat.

Příklad

Strategy řeší obdobný problém jako State, a proto využijeme i obdobný příklad. Maloobchod vytváří objednávku u Velkoobchodu, ale již přímo určuje, jakým způsobem jeho objednávka bude zpracována. Má možnost volit mezi Expresním službou a Standardní službou. Na základě takto zvolené strategie vyřízení objednávky se určuje její rychlost a samozřejmě cena.

Poznámka: třída Služba je opětně abstraktní.

Výsledek

Vytvořením Contextu a Strategy nám umožnilo rozdělit systém do více vrstev. Context obsahuje data, která jsou vstupní pro algoritmus. Strategy objekty implementují věcnou logiku systému. Celý mechanismu zajišťuje zvolení strategie (příslušného Concrete Subject objektu) dynamicky, a proto patří do vzorů chování. Je možné jednoduchým způsobem rozšířit možné strategie (nový objekt Concrete Strategy). Rozšíření neovlivní ani Context ani ostatní strategie, ale pouze proces výběru strategie.

Odůvodnění a souvislosti

Návrhový vzor Strategy je vhodné použít například v těchto případech:

  • Mnoho souvisejících tříd se odlišuje pouze v chování. Vzor umožňuje měnit chování jedné třídy.
  • Jsou potřeba algoritmy, které se odlišují například v časovým vymezením. Tímto může být navržena implementace systému zohledňující historické zákony.
  • Algoritmus používá data, o kterých klient neví. Využitím Strategy se můžeme vyhnout vytvoření velkého slepence dat a logiky.

Strategy vzor by měl být implementován pouze, jestliže jeho výsledek je přímo svázán s klientem, který určuje strategii. Praktické možnosti využití tohoto vzoru:

  • Ukládání souborů v jiných formátech.
  • Rozdílná komprese stejných dat.
  • Vykreslení dat jinými typy grafů (sloupcový, koláčový).

Související vzory

  • State - podobný návrhový vzor jako Strategy, ale odlišuje se účelem. Zatímco chování State objektu se odlišuje na základě stavu objektu, u Strategy si sám klient určuje zvolenou strategii.
  • Bridge - od Strategy se odlišuje zaměřením. Strategy je model chování a určuje, jak je dynamicky měnit. Bridge je strukturální vzor a je zaměřen na vytvoření vazeb mezi objekty.
  • Template Method - Strategy je obdobný Template, ale odlišují se úrovní podrobnosti.

Reference

  • AWT - v této knihovně jsou definovány grafické prvky jako je tlačítko nebo zadávací pole. Jestliže vytváříme aplikaci, umístíme tyto prvky do kontejneru. Kontejner ovšem přímo neřídí uspořádání prvků na ploše. Přenechává tuto odpovědnost layout manažeru. Existuje více typů těchto objektů a odlišují se ve způsobu umístění komponent na ploše, velikostí písma atd. Kontejner může zvolit, který způsob rozvržení využije.

Stránku naposledy upravoval Lubos Pavlicek, 07.02.2006, 00:25