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

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

Strategy. Strategy – „All-in-1“ na začátek class AStrategy { public: virtual void Algorithm()=0; protected: AStrategy(); }; class SpecificStrategy: public.

Podobné prezentace


Prezentace na téma: "Strategy. Strategy – „All-in-1“ na začátek class AStrategy { public: virtual void Algorithm()=0; protected: AStrategy(); }; class SpecificStrategy: public."— Transkript prezentace:

1 Strategy

2 Strategy – „All-in-1“ na začátek class AStrategy { public: virtual void Algorithm()=0; protected: AStrategy(); }; class SpecificStrategy: public AStrategy { public: virtual void Algorithm(); SpecificStrategy(); }; class Context { public: Context(AStrategy* s); void Algorithm(); private: AStrategy* strategy; };

3 Příklad: Indentace kódu v textovém editoru

4 Příklad: Layout managers – AWT (Border Layout)

5 Příklad: Layout managers – AWT (Flow Layout)

6 Různé algoritmy třídění záznamů dle typu klíče  Celočíselné hodnoty a řetězce je možno třídit rychle pomocí přihrádek, ostatní typy je nutno třídit algoritmem založeným na porovnávání Příklad: Třídění záznamů RadixSort - přihrádky (string) RadixSort - přihrádky (int) porovnání typu „double“ porovnání třídy „MyClass“ Algoritmus Sort QuickSort - potřebuje metodu pro porovnání, stejné schéma jako „o patro výše“

7 Strategy Definuje rodinu algoritmů, které zapouzdřuje a umožňuje jejich záměnu. Strategie umožňuje změnu algoritmu nezávisle na klientovi který ji používá…

8 Strategy - použitelnost Použitelnost  pro více souvisejících tříd lišících se pouze chováním v klientské třídě můžeme volit jedno z mnoha chování  pokud je výhodné volit z více variant algoritmů např. umožní reflektovat časovou a prostorovou náročnost  pro algoritmy používající data, o kterých by klient neměl vědět skrývá datové struktury specifické pro algoritmus

9 Účastníci  Context obsahuje ukazatel na abstraktní strategii chování je dáno konkrétní strategií Strategy – struktura (1)

10 Účastníci  Strategy abstraktní třída, definuje rozhraní společné všem algoritmům virtuální metoda Strategy – struktura (2)

11 Účastníci  ConcreteStrategy specifická implementace virtuální metody, čili konkrétního algoritmu Strategy – struktura (3)

12 Strategy – struktura… povědomé? Téměř stejné UML diagramy mají i návrhové vzory State a Bridge  bridge: odděluje abstrakci od její implementace  state: mění chování objektu podle jeho vnitřního stavu, objekt působí jako by změnil třídu

13 Strategy – předávání parametrů strategii (1) implementace  předání v parametrech metody mohou se předávat data, které daná strategie nepotřebuje  předání reference na kontext strategii  obecný kontext – v metodě kontextu se předá ukazatel na strukturu s parametry class Context { public: Context(AStrategy* s); void Algorithm(); private: AStrategy* strategy; int potentialParameter; }; class AStrategy { public: virtual void Algorithm(int p)=0; } class CStrategy: public AStrategy { public: virtual void Algorithm(int p) { // f(p) }; }

14 Strategy – předávání parametrů strategii (2) implementace  předání v parametrech metody  předání reference na kontext strategii strategie přistupuje jen k datům, které potřebuje, kontext musí se strategií více spolupracovat nutnost neustále předávat kontext  obecný kontext – v metodě kontextu se předá ukazatel na strukturu s parametry class Context { public: Context(AStrategy* s); void Algorithm(); private: friend class AStrategy; AStrategy* strategy; int potentialParameter; }; class AStrategy { public: virtual void Algorithm(Context&)=0; protected: //virtual int getNumber(Context& c) int getNumber(Context& c); // vraci private polozku kontextu } class CStrategy: public AStrategy { public: virtual void Algorithm(Context& c) { // f(this->getNumber(c)) }; }

15 Strategy – předávání parametrů strategii (3) implementace  předání v parametrech metody  předání reference na kontext strategii  obecný kontext – v metodě kontextu se předá ukazatel na strukturu s parametry de facto princip „propůjčení ukazatele s důvěrou v rodokmen“ od konkrétní strategie se předpokládá jisté „vychování“ (nesmí půjčovat půjčený ukazatel, musí se k datům chovat slušně) ??? Algorithm() AStrategy* potentialParam1 potentialParam2 potentialParam3 CSTRATEGY Algorithm() { } CONTEXT CSTRATEGY CONTEXT Algorithm() AStrategy* _CData* potentialParam1 potentialParam2 potentialParam3 CONTEXT CSTRATEGY Algorithm(_CData*) { } CSTRATEGY Jak se dostat k parametrům??

16 Strategy – předávání parametrů strategii (4) class Context { public: Context(AStrategy* s); //vytvori i data void Algorithm(); private: AStrategy* strategy; _CData* data; }; class _CData { public: int Parameter; } class AStrategy { public: virtual void Algorithm(void*)=0; } class CStrategy: public AStrategy { public: virtual void Algorithm(void* cd) { // f(((_CData*)cd)->Parameter) }; } implementace  předání v parametrech metody  předání reference na kontext strategii  obecný kontext – v metodě kontextu se předá ukazatel na strukturu s parametry de facto princip „propůjčení ukazatele s důvěrou v rodokmen“ od konkrétní strategie se předpokládá jisté „vychování“ (nesmí půjčovat půjčený ukazatel, musí se k datům chovat slušně)

17 Strategy – předávání parametrů strategii (5) implementace  předání v parametrech metody  předání reference na kontext strategii  obecný kontext – v metodě kontextu se předá ukazatel na strukturu s parametry konkrétní strategie musí v nejobecnější implementaci ukazatel přetypovat, aby uměla s daty pracovat – náročnější na pozornost programátora možno si pohrát s ochranou přístupu u propůjčovaných dat class Context { public: Context(AStrategy* s); //vytvori i data void Algorithm(); private: AStrategy* strategy; _CData* data; }; class _CData { private: friend class Context; _CData() {}; int Parameter; public: int getPatrameter(); } class AStrategy { public: virtual void Algorithm(void*)=0; } class CStrategy: public AStrategy { //... }

18 Strategy – předání strategie přes šablonu strategie jako parametr šablony  použitelné, pokud je strategie známa již v době kompilace a není ji potřeba měnit za běhu programu  není třeba definovat abstraktní třídu pro strategie  strategie je spojena s kontextem staticky – vyšší efektivita template class Context { void Operation() { theStrategy.DoAlgorithm(); } private: AStrategy theStrategy; }; class MyStrategy { public: void DoAlgorithm(); }; Context aContext;

19 Strategy – souvislosti závěrem Zapouzdřuje rodiny souvisejicích algoritmů Eliminuje nutnost podmiňovacích výrazů Výběr z implementací Klient musí být obeznámen s druhy Strategií Zvýšený počet objektů void Cotext::Algorithm () { switch (_strategy) { case STRICT: executeStrictAlgorithm(); break; case RELAXED: executeRelaxedAlgorithm(); break; //... } void Context::Algorithm () { _aStrategy->Algorithm(); }

20 Strategy – „All-in-1“ na konec class AStrategy { public: virtual void Algorithm()=0; protected: AStrategy(); }; class SpecificStrategy: public AStrategy { public: virtual void Algorithm(); SpecificStrategy(); }; class Context { public: Context(AStrategy* s); void Algorithm(); private: AStrategy* strategy; };


Stáhnout ppt "Strategy. Strategy – „All-in-1“ na začátek class AStrategy { public: virtual void Algorithm()=0; protected: AStrategy(); }; class SpecificStrategy: public."

Podobné prezentace


Reklamy Google