Wzorce behawioralne

Transkrypt

Wzorce behawioralne
Wzorce projektowe
dr inż. Marcin Pietroo
Iterator
• czynnościowy wzorzec
projektowy (obiektowy), którego celem jest
zapewnienie sekwencyjnego dostępu do
podobiektów zgrupowanych w większym
obiekcie (np. STL, mogą byd iteratory nie
sekwencyjne)
State
czynnościowy wzorzec projektowy, który
umożliwia zmianę zachowania obiektu poprzez
zmianę jego stanu wewnętrznego. Uzależnia
sposób działania obiektu od stanu w jakim się
aktualnie znajduje.
State
State
• zastosowanie np. gdy w zależności w jakim
środowisku pracujemy (np. system operacyjny)
stosujemy dla obiektów inne algorytmy
• za pomocą wzorca State można zrelaizowad
Strategy
Strategy
Definiuje rodzinę wymiennych algorytmów i kapsułkuje je w postaci klas. Umożliwia
wymienne stosowanie każdego z nich w trakcie działania aplikacji niezależnie od
korzystających z nich klientów.
We wzorcu Strategia definiujemy wspólny interfejs dla wszystkich obsługiwanych
algorytmów i zawierający wszystkie dozwolone operacje.
Implementujemy interfejs w poszczególnych klasach dostarczających konkretne algorytmy.
We wzorcu wyróżniamy także klienta korzystającego z algorytmów. Posiada
on referencję do aktualnie używanej strategii oraz metodę, która pozwala zmienid strategię.
Elementy wzorca:
• Strategia — interfejs definiujący operacje, które muszą obsługiwad wszystkie dostępne
algorytmy. Wszyscy klienci zainteresowani wykorzystaniem algorytmów będą używad
właśnie tego interfejsu.
• Konkretna strategia — implementuje określony algorytm zgodnie ze zdefiniowanym
interfejsem.
• Klient — użytkownik rodziny algorytmów posiadający referencję do obiektu Strategia.
Strategy
Strategy
Zalety:
• wzorzec pozwala na ścisłe, formalne zdefiniowanie rozszerzalnych
rodzin algorytmów dzięki wprowadzeniu interfejsu Strategia,
• eliminacja instrukcji warunkowych,
• umożliwia wybór implementacji — algorytmy mogą rozwiązywad
ten sam problem, lecz różnid się uzyskiwanymi korzyściami (zużycie
pamięci, złożonośd obliczeniowa, optymalizacja pod kątem pewnych
szczególnych przypadków).
• możliwośd niezależnego testowania klientów i strategii
Wady:
• koszt komunikacji między klientem a strategią (wywołania metod,
przekazywanie danych),
• zwiększenie liczby obiektów.
Visitor
• zadaniem jest odseparowanie algorytmu od
struktury obiektowej na której operuje. Praktycznym
rezultatem tego odseparowania jest możliwośd
dodawania nowych operacji do aktualnych struktur
obiektów bez konieczności ich modyfikacji.
• wprowadzony zostaje nowy typ obiektu Wizytator,
którego zadaniem jest "odwiedzenie" każdego
elementu w danej strukturze obiektów i wykonanie na
nim konkretnych działao. Różne implementacje
wizytatorów mogą wykonywad różne zadania,
rozszerzając funkcjonalnośd struktury elementów bez
ich wewnętrznej modyfikacji
Visitor
Visitor
• Każdy odwiedzający jest "przyjmowany" przez dany
element poprzez metodę Accept - dla poszczególnych
implementacji obiektów Element, wołane są odpowiednie
metody Visit w interfejsie Visitor odwiedzającego
• Wzorzec wizytatora może byd zastosowany
przy implementacji drzewa wyprowadzenia w parserach lub
kompilatorach (BCEL, ANTLR itd.)
• Aby wykonad szereg operacji na całym drzewie, trzeba dla
każdego z węzłów drzewa zaimplementowad metody
wykonujące konkretne zadania. Utrzymanie i stworzenie tak
rozwiniętego kodu dla każdej z klas reprezentujących węzeł
w drzewie może byd dośd skomplikowane. Aby uniknąd
takich sytuacji, można wykorzystad wzorzec wizytatora.
Observer
• Używany jest do powiadamiania
zainteresowanych obiektów o zmianie stanu
pewnego innego obiektu.
• W programowaniu obiektowym obiekty posiadają
pewien stan, tj. zbiór aktualnych wartości pól
obiektu, który w wyniku wykonywania na nich
operacji może ulegad zmianie.
• Od bieżącego stanu obiektu mogą byd zależne
inne obiekty, dlatego musi istnied możliwośd ich
powiadomienia o jego zmianie tak, aby mogły
one się do niej dostosowad.
Observer
We wzorcu obserwator wyróżniamy dwa podstawowe typy obiektów:
• obserwowany (ang. observable, subject) - obiekt, o którym chcemy
uzyskiwad informacje,
• obserwator (ang. observer, listener) - obiekty oczekujące na
powiadomienie o zmianie stanu obiektu obserwowanego.
Kiedy stan obiektu obserwowanego się zmienia, wywołuje on metodę
notifyObservers(), która wysyła powiadomienia do wszystkich
zarejestrowanych obserwatorów.
Podczas powiadamiania obserwatorzy otrzymują także referencję do
obiektu obserwowanego. Jeden obserwator może obserwowad kilka
innych obiektów, a jeden obiekt obserwowany może byd obserwowany
przez kilku obserwatorów, ponadto obiekt obserwowany sam może
obserwowad inny obiekt.
Observer
Metoda szablonowa
templateMethod() {
method1();
method2();
}
Zaletą wzorca jest możliwośd zdefiniowania algorytmu składającego się z
niezmiennej sekwencji kroków z jednoczesną możliwością modyfikacji
wybranych przez klienta kroków (np. JUnit)
Łaocuch zobowiązao
czynnościowy wzorzec projektowy, w którym żądanie
może byd przetwarzane przez różne obiekty, w zależności
od jego typu
public void operacja(żądanie: Żądanie) {
jeśli potrafimy obsłużyd dany typ żądania
żądanie:
obsłuż żądanie
w przeciwnym wypadku:
przekaż żądanie następnikowi
}