Stáhnout prezentaci
Prezentace se nahrává, počkejte prosím
ZveřejnilLenka Kolářová
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
Podobné prezentace
© 2024 SlidePlayer.cz Inc.
All rights reserved.