Łańcuch zobowiązań (wzorzec projektowy)

Z Wikipedii, wolnej encyklopedii
Skocz do: nawigacji, szukaj

Łańcuch zobowiązań (ang. Chain of responsibility, niekiedy tłumaczony także jako Łańcuch odpowiedzialności[1]) to jeden z czynnościowych wzorców projektowych, w którym żądanie może być przetwarzane przez różne obiekty, w zależności od jego typu.

Spis treści

[edytuj] Problem

Rozpatrzmy przykładowy komponent systemu, który przetwarza żądania przychodzące od innych komponentów. Każde żądanie ma określony typ, lub daje się zaklasyfikować do jakiejś kategorii. W zależności od typu, żądania mają być przetwarzane w odmienny sposób. Pragniemy zaimplementować mechanizm przetwarzania żądań, który umożliwiłby łatwe dodawanie w przyszłości obsługi nowych typów oraz ich usuwanie w razie potrzeby.

[edytuj] Budowa

Diagram klas wzorca Łańcuch zobowiązań

Wzorzec Łańcuch zobowiązań zakłada utworzenie oddzielnej klasy dla każdej procedury obsługi żądania dziedziczącej po pewnej klasie bazowej AbstrakcyjnaObsluga. Obiekt każdej z procedur może posiadać wskazanie na następnik, tworząc w ten sposób łańcuch procedur przetwarzania. Aby przetworzyć żądanie, wykonujemy metodę operacja() na pierwszym elemencie łańcucha. Jeśli nie potrafi on przetworzyć żądania, powinien przekazać je swojemu następnikowi:

public void operacja(żądanie: Żądanie)
{
   jeśli potrafimy obsłużyć dany typ żądania żądanie:
      obsłuż żądanie
   w przeciwnym wypadku:
      przekaż żądanie następnikowi
}

[edytuj] Konsekwencje użycia

Zalety:

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

Wady:

  • wzorzec nie gwarantuje, że każde żądanie zostanie obsłużone[1],
  • śledzenie i debugowanie pracy działania łańcucha może być trudne[1].

[edytuj] Zastosowanie

Wzorzec znajduje zastosowanie wszędzie tam, gdzie mamy do czynienia z różnymi mechanizmami podobnych żądań, które można zaklasyfikować do różnych kategorii. Dodatkową motywacją do jego użycia są często zmieniające się wymagania.

[edytuj] Przykład użycia

Rozpatrzmy prosty serwer HTTP, który przyjmuje żądania wysyłane przez przeglądarkę. Każde żądanie reprezentowane jest przez pewien obiekt zawierający wszystkie potrzebne informacje (nagłówki, metoda, argumenty, żądany zasób). W łańcuchu zobowiązań możemy wyróżnić kilka procedur dla różnych typów żądań:

  • żądanie wyświetlenia statycznego obrazka lub dokumentu HTML - wczytujemy zasób z dysku,
  • żądanie wyświetlenia pliku rozpoznawanego jako język skryptowy - uruchamiamy interpreter języka i wysyłamy wynik działania skryptu,
  • żądanie wyświetlenia katalogu - przygotowujemy dokument z wypisaną zawartością katalogu.

[edytuj] Zobacz także

Przypisy

  1. 1,0 1,1 1,2 1,3 Eric Freeman, Elisabeth Freeman, Kathy Sierra, Bert Bates: Head First Design Patterns Edycja Polska. Helion, 2005, s. 634-635. ISBN 83-7361-792-2.  (pol.)
Osobiste
Przestrzenie nazw

Warianty
Działania
Nawigacja
Dla czytelników
Dla wikipedystów
Narzędzia
Drukuj lub eksportuj
W innych językach