Heim  >  Artikel  >  Java  >  Verstehen Sie den JAVA-Ereignisbehandlungsmechanismus von Grund auf

Verstehen Sie den JAVA-Ereignisbehandlungsmechanismus von Grund auf

巴扎黑
巴扎黑Original
2017-06-23 16:37:251152Durchsuche

Das Wort „Ereignis“ wurde überbeansprucht. Gerade wegen des Missbrauchs von „Ereignissen“ verstehen viele Menschen die Verwendung von Ereignissen nicht klar und folgen einfach dem gleichen Beispiel. Daher wissen sie nach vielen Jahren des Studiums und der Arbeit immer noch nicht, was ein Ereignisprozessor ist was ein Event-Inhaber ist. Wenn Sie also immer noch Angst vor dem Wort „Ereignis“ haben, dann ist dieser Artikel genau das Richtige für Sie. Lassen Sie uns den Java-Ereignisverarbeitungsmechanismus Schritt für Schritt erklären, von einfach bis schwierig, von konkret bis abstrakt.

1: Beobachtermuster

Um Ereignisse und Überwachung zu verstehen, müssen wir zunächst das Beobachtermuster verstehen.

Was ist der Beobachtermodus? Schauen wir uns zunächst eine bekannte Szene an:

1: Der Lehrer teilt Hausaufgaben zu, benachrichtigt die Schüler; >

2: Die Schüler beobachteten den Lehrer bei der Hausaufgabe und begannen damit; die Schüler nutzten dieses Szenario, um Codierungsprobleme zu erklären, sodass das Thema am Ende definitiv auf den eigentlichen Code zurückkommen wird. Näher zu Hause sind in dieser Szene die Schüler die Beobachter und die Lehrer die Beobachteten, aber jeder muss aufpassen:

Der Lehrer ergreift als Beobachteter tatsächlich die Initiative und ist interessiert Ich habe das Wort „Benachrichtigung“ im Artikel fett gedruckt, da es sich scheinbar um eine einfache Benachrichtigung handelt, in Wirklichkeit aber eine Menge Dinge erforderlich sind (viel Code schreiben).

Okay, lasst uns zuerst das obige Szenario implementieren:

Code:

Beobachter, StudentVerstehen Sie den JAVA-Ereignisbehandlungsmechanismus von Grund auf

Paket com.zuikc.events;

import java.util.Observable;

öffentliche Klasse Student implementiert java.util.Observer {

privater Stringname;

public Student(String name){

this.name = name;

}

@Override

public void update(Observable o, Object arg) {
Teacher teacher = (Teacher) o;
System.out.printf("Schüler %s hat beobachtet (tatsächlich wurde er benachrichtigt), dass %s Hausaufgaben „%s“ n zugewiesen hat", this.name, teacher.getName(), arg) ;
}

}


Beobachter, Lehrer

Paket com.zuikc.events;

import java .util.*;

public class Teacher erweitert java.util.Observable {

private String name;

private List homeworks;

public String getName () {

                                                                                                                                                                                                                                     .

}

public void setHomework(String homework) {

System.out.printf("%s zugewiesene Hausaufgabe %s n", this.name, homework);
homeworks.add ( Hausaufgaben);
setChanged();

notifyObservers(Hausaufgaben);


}
}




Client ::

package com.zuikc.events;

public class Client {


public static void main(String[] args) {

Student student1= neuer Student ("Zhang San");
       Schüler student2 = neuer Schüler("李思");

       Lehrer teacher1 = neuer Lehrer("zuikc"); > teacher1.addObserver(student2);

teacher1.setHomework („Ereignismechanismus Hausaufgaben am ersten Tag“);
}

}

Viele Anfänger haben Illusionen, wenn man bedenkt, dass die Aktion „Beobachtung“ aktiv ist, denke ich, dass in In Bezug auf die Code-Implementierung ruft der Reader aktiv sein eigenes Update auf, aber leider wird das Update vom „beobachteten“ Lehrer nicht aktiv aufgerufen. Einige Leute sagen, dass ich nur


setChanged();
notifyObservers(homework);


in Teacher gesehen habe und es nicht gesehen habe, dass es update aufruft, also Bitte schauen Sie sich die übergeordnete Klasse Observable in der notifyObservers-Methode an,

for (int i = arrLocal.length-1; i>=0; i--)
((Observer)arrLocal [i]).update(this, arg);

Sehen Sie sich die Ergebnisse an:

Verstehen Sie den JAVA-Ereignisbehandlungsmechanismus von Grund auf

Beachten Sie, dass ich im obigen Code direkt die Observable-Klasse und die Observer-Schnittstelle im java.util-Paket verwendet habe. Natürlich können wir diese beiden Dinge auch selbst schreiben.

2: Grundlegender Beobachtermodus

Anfänger sind nicht von Anfang an daran gewöhnt, die API in java.util zu verwenden, und finden sie möglicherweise Wenn Sie es nicht anfassen können, schreiben wir selbst eine Basisversion des Beobachtermusters. Vergleichen Sie beim Schreiben unbedingt das UML-Diagramm und den Code im vorherigen Abschnitt und denken Sie dann nach leise: Es gibt keinen Unterschied zwischen ihnen!

Bild oben:

Verstehen Sie den JAVA-Ereignisbehandlungsmechanismus von Grund auf

Code oben:

Observer, Schnittstelle

Paket com.zuikc ;

public interface Observer {

void update(Observable o);
}

Für bestimmte Beobachter habe ich zwei geschrieben:

Klasse ConcreteObserver1 implementiert Observer {

public void update(Observable o) {
System.out.println("Observer 1 beobachtet" + o.getClass().getSimpleName( ) + "Änderung aufgetreten ");
      System.out.println("Beobachter 1 hat geantwortet"); 🎜> public void update(Observable o) {
System.out.println("Beobachter 2 beobachtet" + o.getClass(). getSimpleName() + "Changed");
System.out. println("Observer 2 antwortete");

}

}


Observer


Paket com.zuikc;

import java.util.ArrayList;

import java.util.List;

public class Observable {

List Observers = new ArrayList();


public void addObserver(Observer o) {

Observers.add(o);

}

public void doSomething() {

System.out.println("Ich werde beobachtet, ich habe mich verändert");

// Alle Beobachter aktiv benachrichtigen
notifyObServers ()

Public void NotifyobServers (); {

for (Observer Observer : Observers) {
                  Observer.update(this); package com.zuikc;

public class Client {

public static void main(String[ ] args) {

Observable observable = new Observable();
observable.addObserver( new ConcreteObserver1());
observable.addObserver(new ConcreteObserver2());
observable.doSomething();
}

}

Sie können den Code selbst ausführen und sehen, was passiert.

Im obigen Code haben wir eine Schnittstelle und eine Beobachterklasse erstellt. Obwohl es etwas einfacher ist, erzielt es den Demonstrationseffekt. Natürlich können wir den Quellcode im JDK auch intakt als Code für unsere beiden Dateien kopieren.

Wenn Sie mit dem obigen Code bereits vertraut sind, können Sie auch die Update-Methode studieren. Im ersten Abschnitt haben wir den arg-Parameter mitgebracht, er ist jedoch nicht in dieser Basisversion enthalten. Es spielt keine Rolle, Sie können es mitbringen, wenn Sie möchten, oder nicht, wenn Sie es nicht möchten, solange Sie die Funktion erkennen.




3: Der Zweck des Beobachtermusters

Die Grundversion des Beobachtermusters ist im Code in unserem schließlich zu einfach Im ersten Abschnitt können wir zusammenfassen:

1: Die Lehrerklasse hat nichts mit der Schülerklasse zu tun. Er verlässt sich nur auf die Beobachterschnittstelle, wenn seine Hausaufgaben nicht nur den Schülern zugewiesen werden Als ausgezeichneter Dozent sendet er es auch an die gesamte Schule Der Lehrer wird als Referenz verwendet. Solange die Lehrerklasse auch die Beobachterschnittstelle implementiert, können wir den Lehrer auch zur Beobachterliste des Lehrers hinzufügen 🎜>2: Das Beobachtermuster trennt den Beobachter und die beobachtete Verantwortung für jede Klasse, sodass jede Klasse ihre eigenen Funktionen beibehalten kann, was die Wiederverwendbarkeit des Systems verbessert

3: Beobachtung scheint ein aktives Verhalten zu sein, aber tatsächlich ruft der Beobachter seinen eigenen Geschäftscode nicht aktiv auf. Im Gegenteil, er wird vom Beobachter aufgerufen. Daher hat das Beobachtermuster einen anderen Namen, nämlich Publish-Subscribe-Muster.

Das Beobachtermuster hat eine andere Form, nämlich das ereignisgesteuerte Modell Die beiden Methoden sind hinsichtlich des Implementierungsmechanismus sehr ähnlich. Auf der Grundlage des Verständnisses des Beobachtermusters ist es sehr einfach, den Ereignisantrieb zu verstehen.

Das obige ist der detaillierte Inhalt vonVerstehen Sie den JAVA-Ereignisbehandlungsmechanismus von Grund auf. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn