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