Dieser Artikel beschreibt die Verwendung des Verantwortungskettenmodus, in dem die Schüler Urlaub nehmen können. Teilen Sie es für Ihre Referenz wie folgt weiter:
1. Musterdefinition
In der Kette des Verantwortungsmodells werden viele Objekte durch Verweise auf ihr nächstes Zuhause durch jedes Objekt verbunden, wobei eine Kette bildet. Die Client -Anwendungsanforderung wird diese Kette übergeben, bis ein Objekt in der Kette beschließt, die Anforderung zu verarbeiten. Der Client, der diese Anfrage stellt, weiß nicht, welches Objekt in der Kette letztendlich die Anfrage bearbeitet, sodass das System die Kette dynamisch neu organisiert und Verantwortlichkeiten zuordnen kann, ohne den Kunden zu beeinflussen.
(1) Abstrakte Prozessorrolle: Definieren Sie eine Schnittstelle für Verarbeitungsanforderungen. Bei Bedarf kann die Schnittstelle eine Methode definieren, um den Verweis auf das nächste Haus zu setzen und zurückzugeben. Diese Rolle wird normalerweise von einer Java -abstrakten Klasse oder einer Java -Schnittstelle implementiert.
(2) Spezifische Verarbeitungsrolle: Nach Empfang der Anforderung kann der spezifische Prozessor die Anforderung verarbeiten oder die Anforderung an das nächste Haus übergeben.
2. Modellbeispiele
1 Musteranalyse
Wir leihen uns den Urlaub der Schüler aus, um dieses Modell zu veranschaulichen
2 Statische Klassendiagramm des Verantwortungskettenmusters
3 Code Beispiele
3.1 Schülerschnittstelle ist iStudent
Paket com.demo.chain.message;/** * Schülerschnittstelle * * @author * */public interface istudent {/** * Erhalten Sie den Zustand des Schülers. / ** * Holen Sie sich die Meldung des Schülers hinterlassen * * @return */ public String getRequestMessage ();}3.2 Schüler erkennen einen Schüler
Paket com.demo.chain.message;/** * Schüler -Implementierungsklasse * * @Author * */öffentliche Klasse Schüler implementiert iStudent {// Größe der Bedingung privat int State = -1; // Abschiedsnachricht private String -Nachricht; public student (int state, string message) {this.state = state; this.message = message; } / ** * den Schüler verlassen. } / ** * Get Student Leave Message * * @return * / public String getRequestMessage () {return this.message; }}3.3 abstrakte Verarbeitungsschnittstelle-ihandler
Paket com.demo.chain.handle; import com.demo.chain.message.istudent;/** * abstrakte Prozessorschnittstelle * * @author * */public interface iHandler {// Processanfrage öffentliche void Handlreenquest (isTudent Student); // Setzen Sie den nächsten Handler Public Void Sethandler (IHandler -Handler);}3.4 AbstractHandler
Paket com.demo.chain.handle; import com.demo.chain.message.istudent;/** * Abstract Handler * * @Author * */public abstract Class AbstractHandler Implements IHandler {// Next Handler Private Ihandler Handler; // Level private int state = -1 verlassen; // Konstruktor -Seting Level öffentlich AbstractHandler (int State) {this.state = STAAT; } // Anfragen an die Unterklasse zur Verarbeitung eines spezifischen Verarbeitungsverarbeitungsprozesses (iStudent Student) bearbeiten; // Anfragen public void Handlrequest (istudent Student) {// Wenn das Schülerobjekt existiert, wenn (student! } else {if (this.handler! // Wenn das aktuelle Objekt nicht verarbeitet werden kann, wird es an den nächsten Prozessor übergeben, um dies zu verarbeiten.Handler.Handlerquest (Schüler); }}}}} // Setzen Sie den nächsten Prozessor public void SetHandler (IHandler -Handler) {this.handler = Handler; }}3.5 Squad Leaderhandler
Paket com.demo.chain.handle; import com.demo.chain.message.istudent;/** * Abstract Handler * * @Author * */public abstract Class AbstractHandler Implements IHandler {// Next Handler Private Ihandler Handler; // Level private int state = -1 verlassen; // Konstruktor -Seting Level öffentlich AbstractHandler (int State) {this.state = STAAT; } // Anfragen an die Unterklasse zur Verarbeitung eines spezifischen Verarbeitungsverarbeitungsprozesses (iStudent Student) bearbeiten; // Anfragen public void Handlrequest (istudent Student) {// Wenn das Schülerobjekt existiert, wenn (student! } else {if (this.handler! // Wenn das aktuelle Objekt nicht verarbeitet werden kann, wird es an den nächsten Prozessor übergeben, um dies zu verarbeiten.Handler.Handlerquest (Schüler); }}}}} // Setzen Sie den nächsten Prozessor public void SetHandler (IHandler -Handler) {this.handler = Handler; }}3.6 Lehrer-Cheferhandler
Paket com.demo.chain.impl; import com.demo.chain.handle.abstractHandler; import com.demo.chain.message.istudent;/** * Lehrerhandler * * @Author * */public class Lehrerhandler erweitert AbstractHandler {öffentlicher Lehrer () {) {Super (1); } // Unterklasse Spezifische Verarbeitungsanforderung @Override public void Process (istudent Student) {System.out.println ("Lehrer Antwort:" + student.getRequestMessage ()); }}3.7 Principal-SchoolmasterHandler
Paket com.demo.chain.impl; import com.demo.chain.handle.abstractHandler; import com.demo.chain.message.istudent;/** * Direktor Handler * * @Author * */Public Class SchoolMasterHandler erweitert AbstractHandler {public schoolmaster- masterpedler () {) {) {{) {{) {{{{{{{{{{{{) {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{) (2) erweitert; } // Unterklasse Spezifische Verarbeitungsanforderung @Override public void Process (istudent student) {System.out.println ("Schulleiter Antwort:" + student.getRequestMessage ()); }}3.8 Aussehen Klasse 1 ProcessHandler
Paket com.demo.chain.process; import com.demo.chain.handle.ihandler; import com.demo.chain.impl.schoolmasterHandler; import com.demo.chain.impl.Squadleaderhandler; import. Chain Association * * @Author * */public class ProcessHandler {// Klassenleiter Handler Private Finale IHandler SQMSHANDLER; // Lehrer Handler Private Final IHandler TechHandler; // Principal Handler Private Final IHandler SCMSHANDLER; // Singleton -Modus private statische processHandler processHandler = new ProcessHandler (); / *** Konstruktorenmethode zur Festlegung einer Verantwortungskette für die Verarbeitung von Urlaub*/ privat processHandler () {// Verarbeitungsobjekt // Klassenleiter this.sqmShandler = new squadleaderHandler (); // Lehrer this.techHandler = new TeacherHandler (); // Direktor this.scmShandler = new SchoolMasterHandler (); / *** Legen Sie eine Verantwortungskette fest // Setzen Sie den nächsten Handler des Lehrers: Schulleiter This } / ** * eine Singleton -Objektinstanz erhalten * * @return * / public static processHandler getInstance () {return processHandler; } / ** * eine Urlaubsanforderung senden * * @param meldung * / public void sendMessage (istudent student) {// an den ersten Handler senden: Klassenleiter überlegt dies. }}3.9 Client-Client
Paket com.demo; import java.util.random; import com.demo.chain.message.istudent; com.demo.chain.message.student; args) {// Erhalten Sie das Erscheinungsobjekt proceshandler processHandler = processHandler.getInstance (); // Erstellen Sie ein Zufallszahl -Objekt, mit dem zufällig ein Student -Objekt zufällig erzeugt RAMATION = New Random (); für (int i = 0; i <3; i ++) {// Zufallszahl int radom = random.nextint (3); IStudent Student = New Student (Radom, "Student" + i + "Ich bin krank, ich möchte Urlaub nehmen!"); System.out.println("##################################################################################### ########################################################################################################## ########################################################################################################## ################################################################################################################################################################################################################## zu erhaltenz zuhalten // Verarbeiten Sie die Nachricht processHandler.sendMessage (Student); System.out.println ("###########################################################################################/n"); }}}4 Auslaufergebnisse
#################################################################################################################################### zu erhalten
Fordern Sie eine Antwort vom Superior Leader an!
Fordern Sie eine Antwort vom Superior Leader an!
Die Antwort des Schulleiters: Student 0 ist krank und möchte Urlaub nehmen!
#################################################################################################################################### zu erhalten
#################################################################################################################################### zu erhalten
Fordern Sie eine Antwort vom Superior Leader an!
Fordern Sie eine Antwort vom Superior Leader an!
Die Antwort des Schulleiters: Student 1 ist krank und möchte Urlaub nehmen!
#################################################################################################################################### zu erhalten
#################################################################################################################################### zu erhalten
Der Klassenmonitor genehmigt: Student 2 ist krank und möchte Urlaub nehmen!
#################################################################################################################################### zu erhalten
III. Die Designprinzipien dieses Musters
1 "Open-Close" -Prinzip
2 Prinzip der Einzelverantwortung
4. Verwenden Sie Anlässe
(1) Es gibt mehrere Objekte, die dieselbe Anforderung verarbeiten. Es ist immer noch ungewiss, mit welchem zur damit verbundenen Umgang mit damit verbunden ist. Es wird nur zur Laufzeit bestimmt, die das Objekt damit umgeht.
(2) Die Nachricht hat mehrere Empfänger, und das empfangende Objekt ist unklar. Sie müssen nur eine Nachricht an eines der Objekte senden und intern umgehen.
(3) Mehrere Verarbeitungsobjekte derselben Nachricht können dynamisch zunehmen oder abnehmen und dynamisch angegeben werden.
5. Statische Klassendiagramm des Verantwortungskettenmusters
Für mehr Java-bezogene Inhalte können Leser, die an dieser Website interessiert sind, die Themen anzeigen: "Java-Datenstruktur und Algorithmus-Tutorial", "Zusammenfassung der Java-Operation DOM-Knoten-Tipps", "Zusammenfassung der Java-Datei- und Verzeichnisoperationstipps" und "Zusammenfassung von Java Cache Operation Tipps" "
Ich hoffe, dieser Artikel wird für Java -Programme aller hilfreich sein.