Was sind die Vorteile der Verantwortungskette gegenüber Klassenlisten?Java

Java-Forum
Guest
 Was sind die Vorteile der Verantwortungskette gegenüber Klassenlisten?

Post by Guest »

Kürzlich 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 geschrieben Java, aber ich vermute, dass dieses Problem auch in anderen Sprachen wie C# auftreten könnte.

Um dieses Problem zu lösen, schlug er die Verwendung eines Chain-of-Responsibility-Musters vor.Er schlug vor, einen Basis-„Handler“ zu haben Klasse. Dann würden „Handler1“, „Handler2“ usw. „Handler“ erweitern.

Dann hätten Handler eine „getSuccessor“-Methode, die entweder null zurückgeben würde (wenn es die letzte wäre). Kette) oder der nächste Handler der Kette.

Dann würde eine „handleRequest(Request)“-Funktion entweder die Anfrage bearbeiten oder sie an den nächsten Handler der Kette weitergeben und, falls keiner der vorherigen Handler vorhanden ist Lösungen funktionierten, das würde es Geben Sie einfach null zurück oder werfen Sie eine Ausnahme aus.

Um einen neuen Handler zur Kette hinzuzufügen, würde der Codierer zum letzten Element der Kette gehen und ihm mitteilen, dass es ein neues Element gibt. Um etwas zu tun, ruft er einfach handleRequest für das erste Element der Kette auf.

Um dieses Problem zu lösen, habe ich einen anderen Ansatz vorgeschlagen.
Ich hätte auch eine Basisklasse „Handler“ mit „Handler1“, „Handler2“, genau wie die zuvor erwähnte Methode.

Es gäbe jedoch keine „getSuccessor“-Methode . Stattdessen hätte ich eine Collection-Klasse mit einer Liste von Handlern (einen Vektor, eine ArrayList oder was auch immer in diesem Fall am besten ist).

Die handleRequest-Funktion würde immer noch existieren, aber sie würde nicht existieren den Aufruf an die nächsten Handler weitergeben. Es würde nur die Anfrage verarbeiten oder null zurückgeben.

Um eine Anfrage zu bearbeiten, würde man

verwenden

Code: Select all

for(Handler handle : handlers){
result = handle.handleRequest(request);
if(result!=null) return result;
}
throw new CouldNotParseRequestException(); //just like in the other approach
Oder, um eine Codeduplizierung zu verhindern, könnte eine „parseRequest(request)“-Methode zur Sammlungsklasse hinzugefügt werden.
Um einen neuen Handler hinzuzufügen, würde man Folgendes tun Gehen Sie zum Sammlungskonstruktor (oder zum statischen {}-Block oder etwas Ähnlichem) und fügen Sie einfach den Code „addHandler(new Handler3());“ hinzu.

Genau das für Vorteile der Verantwortungskette bin ich fehlt bei diesem Ansatz? Welche Methode ist die beste (vorausgesetzt, es gibt eine beste Methode)? Warum? Welche potenziellen Fehler und Probleme können die einzelnen Entwurfsmethoden verursachen?

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

Code: Select all

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

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post