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
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
Fin