Double expédition
Qu'est-ce que la double distribution?
Lorsque nous parlons de programmation orientée objet, nous parlons souvent du «polymorphisme» orienté objet. Parmi eux, il y a souvent un dicton sur le polymorphisme que "la référence de la classe parent pointe vers l'objet de classe enfant".
Ce point de référence de classe parent aux objets de sous-classe est écrit comme les suivants:
Animal animal = nouveau chien (); animal.bark ();
Une autre forme couramment utilisée est
gardien de classe publique {public void dit (animal a) {System.out.println ("Animal Say"); } public void dit (chien de chien) {System.out.println ("Dog dit"); }} Animal animal = nouvel animal (); Chien animal = nouveau chien (); Keeper Keeper = New Keeper (); gardien.Say (animal); Keep.say (chien); Quel contenu sera sorti lorsque le gardien ci-dessus dit deux fois? Est-ce que deux méthodes différentes seront appelées?
En fait, au cours de ces deux appels, la méthode indique que (l'animal a) sera appelé. Étant donné que ces contenus peuvent être trouvés dans la période de compilation, il s'agit de la distribution statique de Java.
D'après la figure ci-dessus, nous pouvons voir que le bytecode généré par les deux appels pointe vers la méthode Say (Animal A). La méthode est directement exécutée au moment de l'exécution et le contenu correspondant est sorti.
Pourquoi l'animal correspondant.bark () finit-il par appeler la méthode de la classe de chiens? Il s'agit de déterminer le type du destinataire de la méthode spécifique lors de l'exécution et de l'exécuter. Ceci est appelé distribution dynamique, qui détermine des méthodes spécifiques lors de l'exécution et met en œuvre le polymorphisme orienté objet.
Expédition
La distribution fait référence au processus de finalisation d'une méthode à exécuter.
Pour les langages statiques tels que Java, ils sont tous exécutés par distribution unique (répartition unique).
Par exemple, une ligne de code
dog.eat(new Bone())
L'exécution finale de la méthode EAT à sélectionner ne sélectionnera que la méthode correspondante en fonction du type spécifique du chien, et les paramètres passés ne peuvent pas affecter la sélection de la méthode correspondante. Ceci est un seul envoi
Afin de faire passer les paramètres réels, Bone est là pour vraiment jouer un rôle, vous devez utiliser Double Dispatch ou Multiple Dispatch
C'est-à-dire que la décision finale n'est pas seulement le récepteur de la méthode, mais aussi le type de paramètre.
Mode visiteur
En mode conception de GoF, le mode visiteur utilise une double répartition pour atteindre le but d'appeler des objets réels.
Pour le mode visiteur, l'exemple le plus courant est la traversée des arbres. Par exemple, il existe des différences dans la manière de traiter les nœuds et les feuilles. Cela se fait par la double distribution du visiteur pour implémenter différents éléments et exécuter différents contenus.
Le code ressemble à ceci:
Node.Accept (New ConreatEvitItor ()); Leaf.Accept (New ConreatEvisitor ());
La méthode d'acceptation dans Node transmettra à nouveau son type réel au visiteur
public void accepter (Visitor v) {v.Visit (this); }Pour le moment, chez le visiteur, vous pouvez appeler des méthodes spécifiques en fonction du type réel, et il existe des méthodes similaires à celles correspondant au nœud et à la feuille:
Visite de vide publique (nœud N); Visite du vide public (feuille L);
Visiteur pour résumer, il comprend généralement l'interface du visiteur. Dans l'interface du visiteur, il contient la logique de traitement de chaque objet d'élément pour accéder. Dans l'implémentation spécifique de chaque élément, vous transmettez votre propre type au visiteur pour la distribution secondaire pour implémenter l'appel logique exact.
Applications à Tomcat
Le visiteur est également utilisé dans Tomcat, analysant généralement les expressions EL.
Par exemple org.apache.el.parser.node
Cette classe contient une méthode d'accept (visiteur novice de novices)
Il existe de nombreux types de nœuds réels, mais à ce moment de l'appel réel, il passera
public void accepter (visiteur nodavisitor) lève une exception {Visitor.Visit (this);En remettant le type réel au visiteur, une méthode spécifique sera appelée dans la visière, afin que les paramètres puissent également jouer un rôle décisif.
Public void Visit (Node Node) lève ELEXception {if (nœud instanceof AstFunction) {ASTFunction funcnode = (astfunction) node; Méthode m = null; } else if (xxx) {} Ici, plusieurs méthodes de visite seront déclarées et la visite ci-dessus (ceci) sera directement située sur la méthode cible.
Ce qui précède sont les différentes distributions en Java et le modèle des visiteurs pour obtenir une double distribution à travers la forme de modèles. J'espère que ce sera utile à tout le monde. Si vous avez des questions, laissez-moi un message. L'éditeur répondra à tout le monde à temps!