Wzorce czynnościowe - Łańcuch zobowiązań, Mediator, Metoda szablonowa, Obserwator, Strategia, Stan Flashcards
Wzorce czynnościowe
- łańcuch zobowiązań
- mediator
- metoda szablonowa
- obserwator
- stan
- strategia
Łańcuch zobowiązań - nazwy
ang. chain of responsibility
Łańcuch zobowiązań - typ
obiektowy, czynnościowy
Łańcuch zobowiązań - Przeznaczenie
Pozwala uniknąć wiązania nadawcy żądania z jego odbiorcą, ponieważ umożliwia obsłużenie żądania więcej niż jednemu obiektowi. Łączy w łańcuch obiekty odbiorcze i przekazuje między nimi żądanie do momentu obsłużenia go.
Łańcuch takich obiektów tworzy listę jednokierunkową, w której odpowiedzialność za przetworzone żądanie spada na najlepiej przygotowany do tego obiekt.
Łańcuch zobowiązań - Uzasadnienie
Używając systemu pomocy, możemy chcieć uzyskać pomoc dotyczącą konkretnego elementu. Jesli ten element nie obsługuje udzielania pomocy przekaże to następnemu.
Pierwszy obiekt w łańcuchu odbiera żądanie i albo je obsługuje, albo przekazuje do następnego kandydata, a ten robi to samo. Obiekt zgłaszający żądanie nie wie, który obiekt je obsłuży. Można powiedzieć, że żądanie ma niejawnego odbiorcę.
Łańcuch zobowiązań - Warunki stosowania
- Kiedy więcej niż jeden obiekt może obsłużyć żądanie, a nie wiadomo z góry, który z nich to zrobi. Obiekt obsługujący żądanie powinien być ustalany automatycznie.
- Jeśli chcesz przesyłać żądanie do jednego z kilku obiektów bez bezpośredniego określania odbiorcy.
Łańcuch zobowiązań– Elementy i współdziałanie
• Handler - obiekt obsługujący:
- definiuje interfejs do obsługi żądań;
- (opcjonalnie) obejmuje implementację odwołania do następnika.
• ConcreteHandler - konkretny obiekt obsługujący:
- obsługuje żądania, za które odpowiada;
- może uzyskać dostęp do następnika;
- jeśli obiekt ConcreteHandler potrafi obsłużyć żądanie, robi to; w przeciwnym razie przekazuje je do następnika.
• Client:
- inicjuje żądanie kierowane do obiektu ConcreteHandler wchodzącego w skład łańcucha.
• Kiedy klient zgłosi żądanie, będzie ono przekazywane wzdłuż łańcucha do czasu, kiedy obiekt ConcreteHandler nie podejmie się jego obsługi.
Łańcuch zobowiązań– Konsekwencje
- Zapewnia mniejsze powiązanie. Wzorzec ten sprawia, że obiekty nie muszą wiedzieć, który z innych obiektów obsługuje żądanie. Obiekt potrzebuje jedynie informacji o tym, że żądanie zostanie właściwie obsłużone.
- Zwiększa elastyczność w zakresie przypisywania zadań obiektom. Łańcuch zobowiązań zwiększa elastyczność przy podziale zadań między obiekty
- Nie zapewnia gwarancji odbioru żądania. Ponieważ żądanie nie ma jawnego odbiorcy, nie ma gwarancji, że zostanie obsłużone.
Łańcuch zobowiązań– Implementacja
- Łączenie następników. Jeśli nie można zdefiniować łańcucha za pomocą istniejących referencji, trzeba je dodać samodzielnie.
- Implementowanie łańcucha następników. Łańcuch następników można zaimplementować na dwa sposoby:
- przez zdefiniowanie nowych powiązań (zwykle w klasie Handler, ale można to zrobić także w klasach ConcreteHandler);
- przez wykorzystanie istniejących powiązań.
• Reprezentowanie żądań. Żądania można reprezentować na różne sposoby. W najprostszej wersji żądanie jest zapisanym na stałe wywołaniem operacji. Jest to wygodne i bezpieczne, jednak pozwala przekazywać tylko stały zestaw żądań zdefiniowanych w klasie Handler. Inna możliwość to zastosowanie pojedynczej funkcji obsługi żądania przyjmującej jako parametr kod żądania (na przykład stałą w postaci liczby całkowitej lub łańcucha znaków).
Łańcuch zobowiązań– Powiązane wzorce
Często występuje ze wzorcem kompozyt (obiekt nadrzędny pełni rolę jego następnika)
Mediator - nazwy
ang. mediator
Mediator - typ
obiektowy, czynnościowy
Mediator - Przeznaczenie
Określa obiekt kapsułkujący informacje o interakcji między obiektami z danego zbioru. Wzorzec ten pomaga zapewnić luźne powiązanie, ponieważ zapobiega bezpośredniemu odwoływaniu się obiektów do siebie i umożliwia niezależne modyfikowanie interakcji między nimi. Innymi słowy mediator jest pośrednikiem w komunikacji pomiędzy wieloma obiektami – obiekty te znają tylko mediatora, natomiast mediator zna wszystkie obiekty systemu (topologia gwiazdy).
Mediator - Uzasadnienie
- Projekt obiektowy zachęca do rozmieszczania zachowań w różnych obiektach. Może to prowadzić do powstania struktury obiektów z wieloma powiązaniami. W najgorszym przypadku każdy obiekt wie o istnieniu wszystkich pozostałych.
- Między widgetami z okna dialogowego często występują zależności. Na przykład przycisk może być nieaktywny, jeśli określone pole na dane wejściowe jest puste. Zaznaczenie pozycji na liście opcji (tak zwanej liście rozwijanej) może spowodować zmianę zawartości pola na dane wejściowe. I na odwrót — wprowadzenie tekstu w takim polu może spowodować automatyczne zaznaczenie jednej lub kilku pozycji na liście rozwijanej. Kiedy w polu na dane wejściowe pojawi się tekst, system może udostępnić inne przyciski umożliwiające użytkownikowi wykorzystanie tego tekstu, na przykład zmodyfikowanie lub usunięcie elementu, którego on dotyczy.
Mediator - Warunki stosowania
- Zestaw obiektów komunikuje się w dobrze zdefiniowany, ale skomplikowany sposób. Powstałe w wyniku tego zależności są nieustrukturyzowane i trudne do zrozumienia.
- Powtórne wykorzystanie obiektu jest trudne, ponieważ odwołuje się on do wielu innych obiektów i komunikuje się z nimi.
- Dostosowanie zachowania rozproszonego po kilku klasach nie powinno wymagać tworzenia wielu podklas.
Mediator - Elementy i współdziałanie
• Mediator:
- definiuje interfejs do komunikowania się z obiektami współpracującymi.
• ConcreteMediator:
- zapewnia współdziałanie przez koordynowanie obiektów współpracujących;
- zna powiązane z nim obiekty współpracujące i zarządza nimi.
• Klasy z rodziny Colleague , czyli klasy współpracujące:
- każdy obiekt współpracujący zna powiązany z nią obiekt Mediator;
- każdy obiekt współpracujący komunikuje się z mediatorem zamiast z innymi takimi obiektami.
• Obiekty współpracujące wysyłają i przyjmują żądania za pośrednictwem obiektu Mediator.
Mediator zapewnia współdziałanie przez przekazywanie żądań między odpowiednimi współpracownikami.
Mediator - Konsekwencje
- Ogranicza tworzenie podklas. Mediator pozwala umieścić w jednym miejscu zachowanie, które standardowo trzeba rozproszyć między kilka obiektów.
- Rozdziela obiekty współpracujące. Mediator ułatwia zachowanie luźnego powiązania między obiektami współpracującymi.
- Upraszcza protokoły obiektów. Mediator pozwala zastąpić interakcje typu wiele do wielu komunikacją typu jeden do wielu (między mediatorem i powiązanymi z nim współpracownikami).
- +/- Centralizuje sterowanie. Wzorzec Mediator pozwala zamienić złożoność interakcji na złożoność samego mediatora (uwaga na antywzorzec „god class”)
Mediator - Implementacja
- Pominięcie klasy abstrakcyjnej Mediator. Jeśli obiekty współpracujące korzystają z tylko jednego mediatora, nie trzeba definiować klasy abstrakcyjnej Mediator.
- Komunikacja między współpracownikami i mediatorem. Obiekty współpracujące muszą komunikować się z mediatorem, kiedy wystąpi istotne zdarzenie. Jedną z możliwości jest zaimplementowanie klasy Mediator jako obserwatora.
Mediator - Powiązane wzorce
- Fasada - działa podobnie, jednak jest jednokierunkowa (kieruje żądania do klas podsystemu).
- Obserwator - obiekty współpracujące mogą komunikować się z mediatorem za tego wzorca.
Obserwator - nazwy
ang. observer
pol. obiekty zależne
ang. dependents
pol. publikuj-subskrybuj
ang. publish-subscribe
Obserwator - typ
obiektowy, czynnościowy
Obserwator - Przeznaczenie
Określa zależność jeden do wielu między obiektami. Kiedy zmieni się stan jednego z obiektów, wszystkie obiekty zależne od niego są o tym automatycznie powiadamiane i aktualizowane.
Zaletą użycia tego wzorca projektowego jest luźne powiązanie pomiędzy klasami oraz możliwość dynamicznej zmiany tych powiązań. Klasy obserwatorów jak i obiektów obserwujących nie muszą o sobie wiele wiedzieć, przez co nie tworzą się niepotrzebne zależności.