Doppelter Versand
Was ist die Dual -Distribution?
Wenn wir über objektorientierte Programmierung sprechen, sprechen wir oft über objektorientierte "Polymorphismus". Unter ihnen gibt es oft ein Sprichwort über den Polymorphismus, dass "die übergeordnete Klassenreferenz auf das Objekt der Kinderklasse verweist".
Diese übergeordnete Klassenreferenz zeigt auf Unterklasse -Objekte wie folgt:
Tiertier = neuer Hund (); Animal.Bark ();
Eine andere häufig verwendete Form ist
public class Keeper {public void sagt (Tier A) {System.out.println ("Tier Say"); } public void sagt (Hundhund) {System.out.println ("Hund sagt"); }} Animal = new Animal (); Tierhund = neuer Hund (); Keeper Keeper = New Keeper (); Keeper.Say (Tier); keep.say (Hund); Welcher Inhalt wird ausgegeben, wenn der oben genannte Torhüter zweimal sagt? Werden zwei verschiedene Methoden aufgerufen?
Tatsächlich wird in diesen beiden Aufrufen die Methode besagt, dass (Tier A) aufgerufen wird. Da diese Inhalte in der Zusammenstellungsperiode gefunden werden können, ist dies die statische Verteilung von Java.
Aus der obigen Abbildung können wir sehen, dass der von den beiden Aufrufen erzeugte Bytecode auf die Methode zum Say (Tier A) zeigt. Die Methode wird zur Laufzeit direkt ausgeführt und der entsprechende Inhalt wird ausgegeben.
Warum nennt das entsprechende Animal.Bark () die Methode der Hundeklasse? Dies dient dazu, den Typ des spezifischen Methodenempfängers zur Laufzeit zu bestimmen und ihn auszuführen. Dies wird als dynamische Verteilung bezeichnet, die spezifische Methoden zur Laufzeit bestimmt und objektorientiertes Polymorphismus implementiert.
Versenden
Die Verteilung bezieht sich auf den Prozess der Ausführung einer Methode.
Für statische Sprachen wie Java werden alle durch einzelne Verteilung (einzelner Versand) ausgeführt.
Zum Beispiel eine Codezeile
dog.eat(new Bone())
Die endgültige Ausführung der ausgewählten EAT -Methode wählt nur die entsprechende Methode gemäß dem spezifischen Typ des Hundes aus, und die übergebenen Parameter können die Auswahl der entsprechenden Methode nicht beeinflussen. Dies ist ein einzelner Versand
Um die übergebenen realen Parameter zu machen, muss Bone hier wirklich eine Rolle spielen. Sie müssen einen Doppelversand oder mehrere Versand verwenden
Das heißt, die endgültige Entscheidung ist nicht nur der Empfänger der Methode, sondern auch der Parametertyp.
Besuchermodus
Im GOF -Konstruktionsmodus verwendet der Besuchermodus den Doppelversand, um den Zweck des Aufrufens realer Objekte zu erreichen.
Für den Besuchermodus ist das häufigste Beispiel die Baumverletzung. Zum Beispiel gibt es Unterschiede in der Art und Weise, Knoten und Blätter zu verarbeiten. Dies geschieht durch die doppelte Verteilung des Besuchers, um verschiedene Elemente zu implementieren und unterschiedliche Inhalte auszuführen.
Der Code sieht so aus:
node.accept (neuer Concrereatevisitor ()); Leaf.accept (neuer Concreatevisitor ());
Die Akzeptanzmethode im Knoten übergibt ihren realen Typ wieder an den Besucher zurück
public void Accept (Besucher v) {v.vissit (this); }Zu diesem Zeitpunkt können Sie im Besucher bestimmte Methoden gemäß dem tatsächlichen Typ aufrufen, und es gibt Methoden, die denjenigen ähneln, die Knoten und Blatt entsprechen:
öffentlicher Void -Besuch (Knoten n); öffentlicher Leerlaufbesuch (Blatt L);
Besucher, um zusammenzufassen, enthält es im Allgemeinen die Besucherschnittstelle. In der Besucherschnittstelle enthält es die Verarbeitungslogik jedes zugegriffenen Elementobjekts. Bei der spezifischen Implementierung jedes Elements geben Sie Ihren eigenen Typ an den Besucher zur Sekundärverteilung zurück, um den genauen Logikaufruf zu implementieren.
Anwendungen in Tomcat
Besucher wird auch in Tomcat verwendet, wobei typischerweise El -Ausdrücke analysiert werden.
Zum Beispiel org.apache.el.parser.node
Diese Klasse enthält eine Akzeptanzmethode (Nodevisitor -Besucher)
Es gibt viele tatsächliche Knotentypen, aber zu dieser Zeit des echten Anrufs wird es passieren
public void Accept (Nodevisitor -Besucher) löst eine Ausnahme aus {Visitor.vissit (this);Wenn Sie den realen Typ an den Besucher zurückgeben, wird eine bestimmte Methode im Visier aufgerufen, damit die Parameter auch eine entscheidende Rolle spielen können.
public void Visit (Knotenknoten) löst Elexception {if (Knoteninstanz von Astfunction) {Astfunction funcnode = (Astfunction) Knoten aus; Methode M = NULL; } else if (xxx) {} Hier werden mehrere Besuchsmethoden deklariert, und der oben genannte Besuch (dies) befindet sich direkt in der Zielmethode.
Die oben genannten sind die verschiedenen Verteilungen in Java und dem Besuchermodell, um die doppelte Verteilung durch die Form von Mustern zu erreichen. Ich hoffe, es wird für alle hilfreich sein. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht. Der Herausgeber wird alle rechtzeitig antworten!