Jakie są zalety łańcucha odpowiedzialności w porównaniu z listami klas?

Ostatnio dyskutowałem z innym programistą o najlepszym sposobie refaktoryzacji ogromnej (1000 linii) metody pełnej instrukcji „if”.

Kod jest napisany w Javie, ale myślę, że ten problem może wystąpić również w innych językach, takich jak C #.

Aby rozwiązać ten problem, zasugerował użycie wzoru łańcucha odpowiedzialności. Zaproponował posiadanie podstawowej klasy „Handler”. Następnie „Handler1”, „Handler2” itd. Rozszerzy „Handler”.
Następnie programy obsługi miałyby metodę „getSuccessor”, która zwracałaby wartość null (jeśli byłaby ostatnim łańcuchem) lub następną obsługę łańcucha.
Następnie funkcja „handleRequest (Request)” albo zajmie się Żądaniem, albo przekaże ją do następnego łańcucha, a jeśli żadne z poprzednich rozwiązań nie zadziała, zwróci tylko wartość null lub rzuci wyjątek.
Aby dodać nowy Handler do łańcucha, koder przejdzie do ostatniego elementu łańcucha i powie, że jest nowy element. Aby coś zrobić, po prostu wywołał handleRequest na pierwszym elemencie łańcucha.

Aby rozwiązać ten problem, zaproponowałem inne podejście.
Miałbym również klasę bazową „Handler”, z „Handler1”, „Handler2”, podobnie jak poprzednia metoda.
Jednak nie byłoby metody „getSuccessor”. Zamiast tego miałbym klasę Collection z listą procedur obsługi (Vector, ArrayList lub cokolwiek jest w tym przypadku najlepsze).
Funkcja handleRequest nadal będzie istnieć, ale nie będzie propagować wywołania do następnych procedur obsługi. Przetwarza żądanie lub zwraca wartość null.
Aby obsłużyć żądanie, można użyć

<code>for(Handler handle : handlers){
    result = handle.handleRequest(request);
    if(result!=null) return result;
}
throw new CouldNotParseRequestException(); //just like in the other approach
</code>

Lub, aby zapobiec duplikacji kodu, do klasy kolekcji można dodać metodę „parseRequest (request)”. Aby dodać nowy moduł obsługi, należy przejść do konstruktora kolekcji (lub statycznego bloku {} lub czegoś równoważnego) i po prostu dodać kod „addHandler (nowy Handler3 ());”.

Jakie dokładnie korzyści łańcucha odpowiedzialności brakuje mi w tym podejściu? Która metoda jest najlepsza (zakładając tam)jest najlepsza metoda)? Czemu? Jakie potencjalne błędy i problemy mogą powodować każda metoda projektowania?

Dla tych, którzy potrzebują kontekstu, oto jak wyglądał oryginalny kod:

<code>if(x instanceof Type1)
{
//doSomething1
} else if(x instanceof Type2)
{
//doSomething2
}
//etc.
</code>

questionAnswers(3)

yourAnswerToTheQuestion