Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

Strategy. Motivace Různé algoritmy pro stejnou akci Hromada kódu v mnoha podmínkách Důsledky  Komplexnost  Špatná čitelnost  Těžká správa kódu  Těžka.

Podobné prezentace


Prezentace na téma: "Strategy. Motivace Různé algoritmy pro stejnou akci Hromada kódu v mnoha podmínkách Důsledky  Komplexnost  Špatná čitelnost  Těžká správa kódu  Těžka."— Transkript prezentace:

1 Strategy

2 Motivace Různé algoritmy pro stejnou akci Hromada kódu v mnoha podmínkách Důsledky  Komplexnost  Špatná čitelnost  Těžká správa kódu  Těžka rozšiřitelnost { if (conditionA) { /*algorithm A*/ } else if (conditionB) { /*algorithm B*/ } else if (conditionC) { /*algorithm C*/ } else if... }

3 Motivace (konkrétně) class compressor {... public: compressor(std::string format) {...} void compress(std::vector data) { if (format == “zip”) { /*compress using zip*/ } else if (format == “tar.gz”) { /*compress using tar.gz*/ }... } }; Tento přístup funguje, nicméně je náročný na údržbu, přidávání a odebírání algoritmů.

4 Motivace (konkrétně) Přístup pomocí Strategie Chceme umět komprimovat data zadaným algoritmem struct c_zip { std::vector operator()(std::vector data) { /*compress using zip and return result*/ } }; template class compressor {... public: void compress(std::vector data) { C_ALG c_alg; std::vector c_data = c_alg(data); } }; struct c_tar_gz { std::vector operator()(std::vector data) { /*compress using tar.gz and return result*/ } };

5 Strategy pattern Strategy - behavioral pattern  Známý též jako Policy pattern Situace, kdy se to hodí  Chceme více algoritmů nad stejnými daty  Chceme různé implementace téhož algoritmu  Chceme mít možnost měnit chování dynamicky  Potřeba skrýt detaily a datové struktury implementace Zapouzdřuje algoritmy ze společné rodiny  Např.: ukládání do různych formátů, operace nad obrazem, GUI layouty

6 Struktura Účastníci  Strategy Interface, definuje rozhraní společné všem algoritmům  ConcreteStrategy Implementace konkrétního algoritmu - strategie  Context Je mu nastaven ConcreteStrategy objekt Spravuje referenci na Strategy objekt Může zpřístupňovat data/API konkrétním ConcreteStrategy objektům

7 Implementace Sdílení dat mezi kontextem a strategií  Předání kontextových dat v parametrech metody Mohou se předávat data, které daná strategie nepotřebuje  Předání reference na kontext strategii Strategie přistupuje jen k datům, které potřebuje Kontext musí se strategií více spolupracovat a musí mít dobré API Strategie může být pro kontextovou třídu volitelná  Defaultní Strategie  Pokud uživatel nechce, nemusí nic nastavovat

8 Implementace – příklad (Java) Strategická hra a chováni jednotek public interface IBehaviour { public void moveCommand(); } public class AgressiveBehaviour implements IBehaviour { public void moveCommand() { // ATTACK } public class DefensiveBehaviour implements IBehaviour { public int moveCommand() { // RUN AWAY } public class NormalBehaviour implements IBehaviour { public int moveCommand() { // IGNORE EVERYBODY } public class Unit { IBehaviour behaviour; String name; public Unit(String name) { this.name = name; } public void setBehaviour(IBehaviour behaviour) { this.behaviour = behaviour; } public void move() {... behaviour.moveCommand();... }... // additional API for Strategy } Rodina strategií Kontext

9 Implementace – příklad (Java) Klientský kód public class Main { public static void main(String[] args) { Unit u1 = new Unit("Megatron"); Unit u2 = new Unit("Optimus Prime"); Unit u3 = new Unit("R2D2"); u1.setBehaviour(new AgressiveBehaviour()); u2.setBehaviour(new DefensiveBehaviour()); u3.setBehaviour(new NormalBehaviour()); u1.move(); u2.move(); u3.move(); u1.setBehaviour(new DefensiveBehaviour()); u2.setBehaviour(new AgressiveBehaviour()); u1.move(); u2.move(); u3.move(); } Operuje jenom na Kontextu Určuje Strategii Kontextu

10 Implementace pomocí šablony (C++) Strategie jako parametr šablony  Kdy? Strategie je známa již v době překladu Nemění se za běhu programu  Výhody Není třeba definovat abstraktní třídu Strategie spojena s kontextem během kompilace – vyšší efektivita template class Context { public: void Operation() { s_.execute(); } private: Strategy s_; }; class MyStrategy { public: void execute(); }; Context myContext;

11 Vlastnosti Výhody  Zapouzdření algoritmu  Převod výběru algoritmu (switch/if) na dědičnost  Rozšiřitelnost chování  Konkrétní chování lze určit za běhu Nevýhody  Overhead  Klient musí umět vybrat strategii

12 Použití v praxi  GUI Validace formulářových prvků Layout manager – různé algoritmy pro layout prvků  Úprava obrazu Různé operace nad obrazem  Třídění Možnost vybírat strategii třídění dle okolností  Komprese dat Různé metody komprese dat  Obecně Nahrávání, ukládání a generování výsledků v různých formátech Operace výstupu (konzole, soubor, síť…) Použití optimalizovaných implementací dle prostředí (např. pomocí Factory metody) Váš šéf: „Chceme, aby aplikace dělala to a tamto, ale ješte to není úplně jisté a může se to v budoucnu změnit…“ Aplikace

13 Související návrhové vzory State  Chování určeno stavem  Stav se může měnit implicitně, Strategii mění uživatel Template method  Template method používá dědičnost pro změnu části algoritmu  Strategy používá delegaci pro změnu celého algoritmu Flyweight  Pokud používáme velké množství Strategií, které si nedrží stav, můžeme použít Flyweight


Stáhnout ppt "Strategy. Motivace Různé algoritmy pro stejnou akci Hromada kódu v mnoha podmínkách Důsledky  Komplexnost  Špatná čitelnost  Těžká správa kódu  Těžka."

Podobné prezentace


Reklamy Google