Definition: Ermöglicht mehrere Objekte die Möglichkeit, die Anforderung zu verarbeiten, wodurch die Kopplungsbeziehung zwischen dem Absender und dem Empfänger der Anfrage vermieden wird. Schließen Sie diese Objekte mit einer Kette an und geben Sie die Anforderung entlang der Kette über, bis ein Objekt sie verarbeitet.
Typ: Verhaltensmuster
Klassendiagramm:
Schauen wir uns zuerst einen Code an:
public void test (int i, request request) {if (i == 1) {Handler1.Response (Anfrage); } else if (i == 2) {Handler2.Response (Request); } else if (i == 3) {Handler3.Response (Anfrage); } else if (i == 4) {Handler4.Response (Anfrage); } else {Handler5.Response (Anfrage); }} Die Geschäftslogik des Codes lautet wie folgt: Die Methode enthält zwei Parameter: die Ganzzahl I und eine Anforderungsanforderung. Nach dem Wert von i, der die Anfrage bearbeitet, wird es von Handler1 behandelt, wenn i == 2 es von Handler2 und so weiter behandelt wird. Bei der Programmierung ist diese Art der Geschäftsbearbeitungsmethode sehr häufig. Alle Klassen, die Prozessanfragen enthalten, wenn ... sonst ... bedingte Beurteilungsanweisungen in eine Verantwortungskette zur Verarbeitung der Anfrage verbunden sind. Ich glaube, jeder benutzt es oft. Die Vorteile dieser Methode sind, dass sie sehr intuitiv, einfach und klar und relativ einfach zu pflegen ist, aber diese Methode hat auch mehrere Kopfschmerzen:
Code aufgebläht: In den tatsächlichen Anwendungen sind die Urteilsbedingungen normalerweise nicht so einfach zu bestimmen, ob es sich um 1 oder 2. handelt. Möglicherweise erfordern sie komplexe Berechnungen, möglicherweise die Abfrage der Datenbank usw. Dies hat eine Menge zusätzlicher Code. Wenn es viele Urteilsbedingungen gibt, dann ist dies, wenn ... sonst ... eine Aussage im Grunde genommen nicht zu lesen ist.
Hoher Kupplungsabschluss: Wenn wir weiterhin Klassen hinzufügen möchten, die Prozessanfragen beantragen, müssen wir weiterhin anders hinzufügen, wenn die Beurteilungsbedingungen; Darüber hinaus wird die Reihenfolge dieser Bedingung auch an die Toten geschrieben. Wenn wir die Reihenfolge ändern möchten, können wir diese Bedingungsanweisung nur ändern.
Da wir die Mängel bereits verstanden haben, müssen wir einen Weg finden, sie zu lösen. Die Geschäftslogik dieses Szenarios ist sehr einfach: Wenn der Zustand 1 erfüllt ist, wird es von Handler1 verarbeitet und wenn er nicht erfüllt ist, wird sie weitergegeben. Wenn der Zustand 2 erfüllt ist, wird er von Handler2 verarbeitet, und wenn er nicht erfüllt ist, wird es bis zum Ende des Zustands weitergegeben. Tatsächlich ist die Verbesserungsmethode auch sehr einfach, nämlich den Teil der Urteilsbedingungen in die Verarbeitungsklasse einzubeziehen. Dies ist das Prinzip des Verantwortungsverbindungsmodells.
Die Struktur des Verantwortungsunternehmensmodells
Das Klassendiagramm des Verantwortungsverbindungsmusters ist sehr einfach, es besteht aus einer abstrakt verarbeiteten Klasse und ihrer Reihe von Implementierungsklassen:
Abstrakte Verarbeitungsklasse: Die abstrakte Verarbeitungsklasse enthält hauptsächlich eine Mitgliedsvariable NextHandler, die auf die nächste Verarbeitungsklasse hinweist, und eine Methode, die die Anforderung bearbeitet. Die Hauptidee der Handrequest -Methode ist, dass diese Verarbeitungsklasse, wenn die Verarbeitungsbedingungen erfüllt sind, verarbeitet wird, sonst wird sie von NextHandler verarbeitet.
Spezifische Verarbeitungsklasse: Spezifische Verarbeitungsklasse implementiert hauptsächlich die spezifische Verarbeitungslogik und die anwendbaren Bedingungen für die Verarbeitung.
Beispiel
Das Modell der Verantwortungskette hat zwei Rollen:
Zusammenfassung Handler -Rolle: Definiert eine angeforderte Schnittstelle. Bei Bedarf können Sie eine Methode definieren, um den Verweis auf das nächste Heimobjekt zu setzen und zurückzugeben.
ConcreteHandler -Rolle: Wenn sie verarbeitet werden kann, verarbeiten Sie die Anfrage. Wenn es nicht verarbeitet werden kann, übergeben Sie die Anfrage an das nächste Haus und lassen Sie es das nächste Haus erledigen. Das heißt, es behandelt Anfragen, die es umgehen kann, und kann auf sein nächstes Zuhause zugreifen.
Der Testcode für das obige Muster lautet wie folgt:
Paket chainofresp;/***Beschreibung: Abstrakte Verarbeitungsrolle*/public abstrakter Klasse Handler {Protected Handler Nachfolger; / ***Beschreibung: Verarbeitungsmethode*/ public abstraktes void HandlerRequest (String -Zustand); Public Handler getuccessor () {return Nachfolger; } public void setSuccessor (Handler -Nachfolger) {this.successor = Nachfolger; }} Package Chainofresp;/***Beschreibung: Detaillierte Handhabung von Rollen*/Public Class ConcreteHandler1 erweitert Handler {@Override public void HandlerRequest (String Condition) {// Wenn es Ihre eigene Verantwortung ist, werden Sie es selbst bewältigen und für das nächste Zuhause verantwortlich sein. zurückkehren ; } else {System.out.println ("ConcreteHandler1 bestanden"); getuccessor (). HandlerRequest (Zustand); }}} Package Chainofresp;/***Beschreibung: Detaillierte Handhabung von Rollen*/Public Class ConcreteHandler2 erweitert Handler {@Override public void HandlerRequest (String Condition) {// Wenn es Ihre eigene Verantwortung ist, werden Sie es selbst bewältigen und für das nächste Zuhause verantwortlich sein. zurückkehren ; } else {System.out.println ("ConcreteHandler2 bestanden"); getuccessor (). HandlerRequest (Zustand); }}} Package ChainoFresp;/*** Beschreibung: Detaillierte Verarbeitungsrolle*/öffentliche Klasse ConcreteHandLern erweitert Handler {/*** Hier wird angenommen, dass n der letzte Knoten der Kette ist, der in tatsächlichen Situationen verarbeitet werden muss. In tatsächlichen Situationen kann ein Ring oder ein Baum erscheinen. * */ @Override public void HandlerRequest (String -Bedingung) {System.out.println ("ConcreteHandLern gehandhabt"); }} Paket chainofresp;/***Beschreibung: Testklasse*/öffentlicher Klasse Client {/***Beschreibung:*/public static void main (String [] args) {Handler Handler1 = new ConcreteHandler1 (); Handler Handler2 = neuer Betonhandler2 (); Handler Handlern = New ConcreteHandLern (); // Kettenhandler1.SetsuScessor (Handler2); Handler2.SetsuScessor (Handlern); // Angenommen, diese Anfrage ist in der Verantwortung von Betonhandler2 Handler1.HandlerRequest ("ConcreteHandler2"); }}
Um diesem Beispiel zu geben, ist die Montagelinie im Produktionsworkshop einer Spielzeugfabrik eine Verantwortungskette. Wenn ein Spielzeugflugzeug einen Schalenanbler, einen Motoranbler, Propeller -Assembler und Modellpacker hat. Wenn das Flugzeug zu jedem, zu dem das Objekt fließt, fließt, ist er für die Installation des Teils, für den er verantwortlich ist, verantwortlich. Nach der Installation dieses Teils fließt er zum nächsten Schritt und weiß, dass alle Umgebungen abgeschlossen sind. Dies ist eine Verantwortungskette, die erzeugt wird. Es gibt auch eine qualitativ hochwertige Inspektionskette, die in mehrere Teile, die Inspektion von Schalen, die Inspektion von Motoren, die Propellerinspektion und die Verpackungsprüfung unterteilt ist. Wenn das Produkt dem Inspektor überlassen wird, um das Stück zu testen, für das er verantwortlich ist, wird es direkt herausgenommen. Wenn es kein Problem gibt, wird es an den nächsten Inspektor übergeben, bis alle Tests abgeschlossen sind. Diese beiden sind Verantwortungsketten, aber der Unterschied besteht darin, dass jeder die Verantwortungskette und den Prozessteil davon verarbeiten wird. Während nach dem Urteil wird die Verantwortungskette für die Qualitätsinspektion entweder verarbeitet oder nicht verarbeitet. Dies sind die beiden Kategorien von Verantwortungsketten. Letzteres wird als reine Verantwortungsketten bezeichnet und erstere heißt unreine Verantwortungsketten. In praktischen Anwendungen existieren selten reine Verantwortungsketten. Der gemeinsame Verantwortungsketten ist unrein. Das obige Modell simuliert reine Verantwortungsketten zum Handeln.
Vor- und Nachteile des Verantwortungskettenmodells
Im Vergleich zu wenn… sonst… das Verantwortungskettenmuster hat eine geringere Kopplungsfähigkeit, da es die bedingten Urteile in verschiedene Verarbeitungsklassen verteilt und die vorrangige Verarbeitungsreihenfolge dieser Verarbeitungsklassen nach Belieben festgelegt werden kann. Das Verantwortungskettenmodell hat auch seine Nachteile, was dem if ... sonst ... Anweisung entspricht, dh, bevor die korrekte Verarbeitungsklasse gefunden wird, müssen alle Urteilsbedingungen ausgeführt werden. Wenn die Verantwortungskette relativ lang ist, ist das Leistungsproblem schwerwiegender.
Anwendbare Szenarien für die Kette des Verantwortungskettenmodells
Genau wie beim Anfangsbeispiel, wenn Sie sich überfordert fühlen, wenn Sie die Anweisung if… sonst… anwesend… eine Verantwortungskette organisieren, können Sie die Kette des Verantwortungsmodus verwenden, um sie neu zu überarbeiten.
Zusammenfassen
Das Verantwortungskettenmodell ist eigentlich eine flexible Version von if ... sonst ... Anweisung. Es steckt diese Urteilsbedingungen in jede Verarbeitungsklasse. Der Vorteil davon ist, dass es flexibler ist, aber auch Risiken bringt. Wenn Sie beispielsweise die Beziehung zwischen der Verarbeitungsklasse vor und nach der Verarbeitungsklasse aufbauen, müssen Sie sehr vorsichtig sein, um die Beziehung zwischen der bedingten Logik vor und nach der Verarbeitungsklasse zu beurteilen und darauf zu achten, keine kreisförmigen Referenzen in der Kette zu haben.