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 }