150 likes | 271 Views
Obiektowe metody projektowania systemów. Design Patterns STRATEGY. Wstęp:. Strategy (strategia): - należy do tzw. behawioralnych wzorców projektowych, czyli charakteryzujących oddziaływania pomiędzy obiektami.
E N D
Obiektowe metody projektowania systemów Design Patterns STRATEGY
Wstęp: Strategy (strategia): - należy do tzw. behawioralnych wzorców projektowych, czyli charakteryzujących oddziaływania pomiędzy obiektami. - ma za zadanie zdefiniowanie rodziny algorytmów i rozdzielenie ich tak aby działały zależnie od potrzeb klienta
Plan: • Zastosowanie • Struktura • Kosekwencje (zalety i wady) • Implementacja • Przykład kodu • Zakończenie
Zastosowanie Strategię stosujemy jeśli: • Wiele powiązanych klas różni się tylko zachowaniem. • Potrzeba kilku wariantów algorytmu. • Algorytm używa danych o których klient nie powinien wiedzieć. • Klasa definiuje wiele zachowań jako wielokrotne instrukcje warunkowe.
Struktura - powiązania • Klasy Strategy i Context współdziałają aby zaimplementować wybrany algorytm. • Context przekazuje żądanie klienta do odpowiedniej strategii.
Konsekwencje Zalety • Strategia pozwala utworzyć rodziny powiązanych algorytmów. • Hermetyzacja algorytmów w oddzielnych klasach pozwala na ich modyfikację niezależnie od kontekstu, zwiększa czytelność, oraz łatwość rozbudowy. • Eliminuje instrukcje wyboru (warunkowe).
Konsekwencje Wady • Klient musi być świadomy różnych algorytmów, aby mógł wybrać właściwy. • Nadmiarowa komunikacja pomiędzy Strategy i Context. • Zwiększona liczba obiektów.
Implementacja • Interfejsy klas Context i Strategy • Strategia jako szablon • Strategia jako rozwiązanie opcjonalne
Przykładowy kod 1 class Composition { private: Compositor* compositor1; Component* components1; int lineWidth; public: Composition(Compositor*); void Repair(); };
Przykładowy kod 2 class Compositor { public: virtual int Compose(int lineWidth) = 0; protected: Compositor(); }; Class SimpleCompositor : public Compositor { public: SimpleCompositor(); int Compose(int lineWidth); // ... }; class TeXCompositor : public Compositor { public: TeXCompositor(); int Compose(int lineWidth); // ... };
Przykładowy kod 3 void Composition::Repair () { int breakCount; breakCount = compositor1->Compose(lineWidth); } Composition* quick = new Composition(new SimpleCompositor); Composition* slick = new Composition(new TeXCompositor);
Podsumowanie: • Strategia umożliwia zdefiniowanie rodziny algorytmów realizujących to samo zadanie, ale różniących się implementacją • Strategia zwiększa czytelność programu i ułatwia jego późniejszą modyfikację.
Bibliografia: • Stroustrup B.: The C++ Programming Language, Addison-Wesley, 2004 • Shalloway A., Trott J.R.: Projektowanie zorientowane obiektowo. Wzorce projektowe, Helion 2002 • Gamma E., Helm R., Johnson R., Vlissides R.:Design Patterns: Elements of Reusable Object-Oriented Software