Łańcuch zobowiązań (wzorzec projektowy)
Ł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
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
|
||||||||||||||