Le mot « événement » a été galvaudé. C'est précisément à cause de l'utilisation abusive des « événements » que de nombreuses personnes ne comprennent pas clairement l'utilisation des événements et suivent simplement le même exemple. En conséquence, après avoir étudié et travaillé pendant de nombreuses années, ils ne savent toujours pas ce qu'est un processeur d'événements. ce qu'est un organisateur d'événement. Donc, si vous avez toujours peur du mot Événement, alors cet article est exactement ce dont vous avez besoin. Expliquons le mécanisme de traitement des événements Java étape par étape, du facile au difficile, du concret à l'abstrait.
1 : Modèle d'observateur
Pour comprendre les événements et la surveillance, nous devons d'abord comprendre le modèle d'observateur.
Qu'est-ce que le mode observateur ? Regardons d'abord une scène familière :
D'accord, implémentons d'abord le scénario ci-dessus :1 : L'enseignant donne des devoirs, notifie les élèves
2 : Les élèves ont observé l'enseignant attribuer des devoirs et ont commencé à le faire ; Les élèves utilisent ce scénario pour expliquer les problèmes de codage, donc le sujet reviendra certainement au code réel à la fin. Plus près de chez nous, dans cette scène, les élèves sont les observateurs et les enseignants sont les observés, mais chacun doit y prêter attention :
L'enseignant, comme l'observé, prend effectivement l'initiative et s'intéresse à J'ai mis en gras le mot « notification » dans l'article car cela semble être une simple notification, mais en fait cela nécessite beaucoup de choses (écrire beaucoup de code).
Code :
Observateur, étudiant
package com.zuikc.events;
import java.util.Observable;
classe publique L'étudiant implémente java.util.Observer { nom de chaîne privée;public Student(String name){
this.name = name;}
@Overridepublic void update(Observable o, Object arg) {
package com.zuikc.events;
Teacher Teacher = (Professeur) o;
System.out.printf("L'élève %s a observé (en fait a été informé) que %s lui avait assigné un devoir "%s" n", this.name, professor.getName(), arg) ;
}
}
Observateur, enseignant
import java .util.*;
classe publique L'enseignant étend java.util.Observable { private String name;Étudiant étudiant2 = nouvel Étudiant("李思");private List
devoirs; public String getName () {
" """""""""""""""}
public void setHomework(String devoirs) {System.out.printf("%s devoirs assignés %s n" , this.name, devoirs);
notifyObservers(homework);
homeworks.add (devoirs);
setChanged();
}
}
Client :package com.zuikc.events;
classe publique Client {Étudiant étudiant1= nouvel Étudiant("Zhang San");
public static void main (String[] args) {
Professeur professeur1 = nouveau Professeur("zuikc") ;
professeur1.addObserver(student1);professeur1.addObserver(student2);professeur1.setHomework("Mécanisme d'événement, devoirs du premier jour");
}}
Beaucoup de débutants ont Illusion, considérant que l'action "d'observation" est active, je pense qu'en termes d'implémentation du code, Reader appelle activement sa propre mise à jour, mais malheureusement, bien sûr pas en termes de code. mise en œuvre, la mise à jour est activement appelée par l'enseignant « observé ». Certaines personnes disent que je n'ai vu que
setChanged();
notifyObservers(homework);dans Teacher et je ne l'ai pas vu appeler update, donc veuillez consulter sa classe parent Observable, dans la méthode notifyObservers,
for (int i = arrLocal.length-1; i>=0; i--)
((Observer)arrLocal [i]).update(this, arg);Regardez les résultats :
Notez que dans le code ci-dessus, j'ai directement utilisé la classe Observable et l'interface Observer dans le package java.util. Bien sûr, nous pouvons également écrire ces deux choses vous-même.
2 : Mode observateur de base
Les débutants ne sont pas habitués à utiliser l'API dans java.util dès le début et peuvent trouver cela difficile Si vous ne pouvez pas y toucher, nous écrirons nous-mêmes une version de base du modèle d'observateur. Tout le monde peut le ressentir. Pendant le processus d'écriture, assurez-vous de comparer le diagramme UML et le code de la section précédente, puis réfléchissez en silence. : Il n'y a aucune différence entre eux.
Photo ci-dessus :
Code ci-dessus :
Observateur, interface
package com.zuikc ;
public interface Observer {
void update(Observable o);
}
Pour des observateurs spécifiques, j'en ai écrit deux :
import java.util.ArrayList;class ConcreteObserver1 implémente Observer {
public void update(Observable o) {
}
System.out.println("Observateur 1 observé" + o.getClass().getSimpleName( ) + "Un changement s'est produit ");
System.out.println("Observateur 1 a répondu"); 🎜> public void update(Observable o) {
System.out.println("Observateur 2 observé" + o.getClass(). getSimpleName() + "Changed");
System.out. println("Observateur 2 répondu");}
Observateur
package com.zuikc;
import java.util.List;
classe publique Observable { ListVous pouvez exécuter le code vous-même et voir ce qui se passe.observers = new ArrayList (); observers.add(o);
public void addObserver(Observer o) {}
public void doSomething() {
System.out.println("Je suis observé, j'ai changé ");// Notifier activement tous les observateurs
Public void NotifyobServers () {
notifyObServers (🎜>}
for (Observer observer : observers) {
public static void main(String[ ] args) {
observer.update(this); package com.zuikc;
public class Client {Observable observable = new Observable();
}
observable.addObserver( new ConcreteObserver1());
observable.addObserver(new ConcreteObserver2());
observable.doSomething();
}
2 : Le modèle d'observateur sépare l'observateur et la responsabilité observée pour chaque classe, permettant à chaque classe de conserver ses propres fonctions, améliore la réutilisabilité du systèmeDans le code ci-dessus, nous avons créé une interface et une classe d'observateur. Bien que ce soit un peu plus simple, cela produit l'effet de démonstration. Bien entendu, nous pouvons également copier le code source dans le JDK intact comme le code de nos deux fichiers.
Si vous connaissez déjà bien le code ci-dessus, vous pouvez également étudier la méthode de mise à jour. Dans la première section, nous avons apporté le paramètre arg, mais il n'est pas inclus dans cette version de base. Peu importe, vous pouvez l'apporter si vous le souhaitez, ou ne pas l'apporter si vous ne le souhaitez pas. Le code est la liberté, à condition que vous en compreniez la fonction.
La version de base du modèle observateur est trop simple après tout, dans le code de notre première section, on peut résumer : 1 : La classe professeur n'a rien à voir avec la classe élève Il s'appuie uniquement sur l'interface observateur Si un jour, ses devoirs ne sont pas uniquement assignés aux élèves, mais comme. un excellent conférencier, il l'envoie également à toute l'école. Le professeur sert de référence, puis tant que la classe professeur implémente également l'interface observateur, on peut aussi ajouter le professeur à la liste des observateurs du professeur
3 : Le but du modèle observateur
;
3 : L'observation semble être un comportement actif, mais en fait l'observateur n'appelle pas activement son propre code métier, au contraire, il est appelé par l'observateur. Par conséquent, le modèle d'observateur a un autre nom, appelé modèle de publication-abonnement, je pense que ce dernier est plus approprié
Le modèle d'observateur a une autre forme, qui est un modèle basé sur les événements, ceux-ci ; Les deux méthodes sont très proches en termes de mécanisme de mise en œuvre.Sur la base de la compréhension du modèle d'observateur, il est très simple de comprendre le pilotage des événements.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!