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