niedziela, 2 marca 2014

Łańcuch zobowiązań (obiektowy)

Łańcuch zobowiązań/odpowiedzialności (Chain of responsibility)


Zadanie może być przetwarzane przez różne obiekty w zależności od jego typu.
Umożliwia obsłużenie zadania więcej niż jednemu obiektowi.

Zalety wzorca:
1) elementy łańcucha mogą być dynamicznie dodawane i usuwane w trakcie działania programu
2) zmniejszenie liczby zależności między nadawcą, a odbiorcami
3) implementacja pojedynczej procedury nie musi znać struktury łańcucha oraz innych procedur

Wady:
1) wzorzec nie gwarantuje, że każde żądanie zostanie obsłużone

Powszechnie stosowany w systemach okienkowych do obsługi zdarzeń takich jak kliknięcie myszki,
przyciśnięcie klawisza.

We wzorcu chodzi głównie o to, że jeżeli przychodzi jakieś żadanie do wykonania to istnieje
kilka stanów, które to żadanie mogą obsłużyć. Procedura wygląda tak, że jeżeli żadanie nie
zostaje obsłużone przez pierwszy obiekt to żadanie zostaje przekazane do następnego obiektu
obsługującego zdażenia. Obsługa zdażeń nie jest zapętlona. Jeżeli żądanie nie zostaje obsłużone
przez żaden obiekt to poprostu kończy się procedura i tyle. Jest to jedna z wad,
jaką charakteryzuje ten wzorzec. Została ona przedstawiona kilka zdań wcześniej.

Diagram klas.


Widać jak zadania są przekazywane z jednej klasy obsługującej do drugiej. Powtórze jeszcze raz.
Dzieje się tak, ponieważ jeżeli klasa nie potrafi obsłuzyć zdarzenia przekazuje to zdarzenie dalej
(do następnej klasy), która też próbuje obsłużyć to zdarzenie. Czasem bywa tak, że żadna klasa nie
potrafi obsłużyć zdarzenia.
Startujemy od Clienta, który wysyła żądanie do pierwszej klasy obsługującej. Jak widać wszsytko
dzieje się sekwencyjnie (podobnie jak w iteratorze). Inaczej nie miało by to sensu.

Przykład z mailem
Załóżmy, że mamy stworzyć system, który będzie segregował przychodzące maile. Jeżeli przyjdzie
spam to zostanie przeniesiony do kosza. Jeżeli jakaś pochwałą do zostanie przekazany na skrzynkę
do sefa firmy. Jeżeli skarga to do działu obsługi błędów.
Po odebraniu list przekazywany jest do pierwszej procedury obsługi - tej, która radzi sobie ze spamem.
Jeżeli nie pasuje ona do złożonego spamu, jego przetwarzanie jest przekazywane do procedury obsługi
pochwał. I tak dalej...

Każdy list jest przekazywany do pierwszej procedury->
->Procedura Obsługi Spamu->
->Procedura Obsługi Pochwał->
->Procedura Obsługi Skarg->
->Procedura Obsługi Zapotrzebowań.

Myśle, że zasada działania tego wzorca powinna być już jasna.

Brak komentarzy:

Prześlij komentarz