Was sind die Vorteile der Verantwortungskette gegenüber Klassenlisten?

Vor kurzem habe ich mit einem anderen Programmierer darüber gesprochen, wie man eine riesige (1000 Zeilen) Methode voller "if" -Anweisungen am besten umgestalten kann.

Der Code ist in Java geschrieben, aber ich vermute, dass dieses Problem auch in anderen Sprachen wie C # auftreten kann.

Um dieses Problem zu lösen, schlug er die Verwendung eines Verantwortungskettenmusters vor. Er schlug eine Basisklasse "Handler" vor. Dann würde "Handler1", "Handler2" usw. "Handler" erweitern.
Dann hätten Handler eine "getSuccessor" -Methode, die entweder null (wenn es der letzte der Kette war) oder den nächsten Handler der Kette zurückgibt.
Dann würde sich eine "handleRequest (Request)" - Funktion entweder mit Request befassen oder es an die nächste der Kette übergeben, und wenn keine der vorherigen Lösungen funktionierte, würde sie nur null zurückgeben oder eine Ausnahme auslösen.
Um der Kette einen neuen Handler hinzuzufügen, springt der Codierer zum letzten Element der Kette und teilt ihm mit, dass es ein neues Element gibt. Um etwas zu tun, rief er einfach handleRequest für das erste Element der Kette auf.

Um dieses Problem zu lösen, schlug ich einen anderen Ansatz vor.
Ich hätte auch eine Basisklasse "Handler" mit "Handler1", "Handler2", genau wie die zuvor erwähnte Methode.
Es würde jedoch keine "getSuccessor" -Methode geben. Stattdessen hätte ich eine Collection-Klasse mit einer Liste von Handlern (ein Vector, eine ArrayList oder was auch immer in diesem Fall am besten ist).
Die handleRequest-Funktion wäre noch vorhanden, würde den Aufruf jedoch nicht an die nächsten Handler weiterleiten. Es würde nur die Anforderung verarbeiten oder null zurückgeben.
Um eine Anfrage zu bearbeiten, würde man verwenden

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

Um eine Codeduplizierung zu verhindern, könnte der Auflistungsklasse eine Methode "parseRequest (request)" hinzugefügt werden. Um einen neuen Handler hinzuzufügen, müssen Sie zum Auflistungskonstruktor (oder zum statischen {} Block oder zu einem äquivalenten Element) wechseln und einfach den Code "addHandler (new Handler3 ())" hinzufügen.

Welche Vorteile der Verantwortungskette vermisse ich bei diesem Ansatz? Welche Methode ist die beste (sofern vorhanden)?ist eine beste Methode)? Warum? Welche potenziellen Fehler und Probleme kann jede Entwurfsmethode verursachen?

Für diejenigen, die Kontext benötigen, ist hier, wie der ursprüngliche Code aussah:

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

Antworten auf die Frage(3)

Ihre Antwort auf die Frage