Despacho doble
¿Qué es la distribución dual?
Cuando hablamos de programación orientada a objetos, a menudo hablamos del "polimorfismo" orientado a objetos. Entre ellos, a menudo hay un dicho sobre el polimorfismo de que "la clase de referencia principal apunta al objeto de clase infantil".
Esta clase de referencia principal apunta a objetos de subclase se escribe como lo siguiente:
Animal animal = nuevo perro (); animal.bark ();
Otra forma comúnmente utilizada es
Public Class Keeper {public void dice (animal a) {system.out.println ("animal dice"); } public void dice (perro perro) {system.out.println ("Dog dice"); }} Animal animal = new Animal (); Perro animal = nuevo perro (); Keeper Keeper = new Keeper (); Keeper.say (animal); Keep.say (perro); ¿Qué contenido se emitirá cuando el Guardián de arriba las llamadas digan dos veces? ¿Se llamarán dos métodos diferentes?
De hecho, durante estas dos llamadas, se llamará el método (animal A). Dado que estos contenidos se pueden encontrar en el período de compilación, esta es la distribución estática de Java.
De la figura anterior, podemos ver que el código de byte generado por las dos llamadas apunta al método Say (Animal A). El método se ejecuta directamente en tiempo de ejecución y el contenido correspondiente se emite.
¿Por qué el animal correspondiente.Bark () termina llamando al método de la clase de perro? Esto es para determinar el tipo de receptor de método específico en tiempo de ejecución y ejecutarlo. Esto se llama distribución dinámica, que determina métodos específicos en tiempo de ejecución e implementa el polimorfismo orientado a objetos.
Despacho
La distribución se refiere al proceso de finalización de un método que se ejecutará.
Para idiomas estáticos como Java, todos se ejecutan a través de una distribución única (envío único).
Por ejemplo, una línea de código
dog.eat(new Bone())
La ejecución final del método EAT a seleccionar solo seleccionará el método correspondiente de acuerdo con el tipo específico del perro, y los parámetros pasados no pueden afectar la selección del método correspondiente. Este es un solo envío
Para hacer que los parámetros reales pasen, Bone está aquí para desempeñar un papel, debe usar el despacho doble o el envío múltiple
Es decir, la decisión final no es solo el receptor del método, sino también el tipo de parámetro.
Modo de visitante
En el modo de diseño de GOF, el modo de visitante utiliza el doble envío para lograr el propósito de llamar a objetos reales.
Para el modo de visitante, el ejemplo más común es el recorrido por el árbol. Por ejemplo, hay diferencias en la forma de procesar nodos y hojas. Esto se realiza a través de la distribución dual del visitante para implementar diferentes elementos y ejecutar diferentes contenidos.
El código se ve así:
node.accept (nuevo ConcreateVisitor ()); Leaf.accept (nuevo ConcreateVisitor ());
El método de aceptación en el nodo volverá a pasar su tipo real al visitante
public void aceptar (visitante v) {v.Visit (this); }En este momento, en el visitante, puede llamar a métodos específicos de acuerdo con el tipo real, y hay métodos similares a los correspondientes al nodo y la hoja:
Visita pública nula (nodo n); Visita pública vacía (Leaf L);
El visitante para resumir, generalmente incluye la interfaz del visitante. En la interfaz del visitante, contiene la lógica de procesamiento de cada objeto de elemento a acceder. En la implementación específica de cada elemento, vuelve a pasar su propio tipo al visitante para su distribución secundaria para implementar la llamada lógica exacta.
Aplicaciones en Tomcat
El visitante también se usa en Tomcat, típicamente analizando las expresiones EL.
Por ejemplo, org.apache.el.parser.node
Esta clase contiene un método de aceptar (visitante de nodevisitor)
Hay muchos tipos de nodos reales, pero en este momento de la llamada real, pasará
public void Aceptar (NodeVisitor Visitor) lanza la excepción {Visitor.Visit (this);Al pasar el tipo real al visitante, se llamará a un método específico en el visor, para que los parámetros también puedan desempeñar un papel decisivo.
Public void visit (nodo nodo) arroja elexception {if (nodo instanceo de Astfunction) {AstFunction funcNode = (ASTFunction) nodo; Método m = nulo; } else if (xxx) {} Aquí, se declararán múltiples métodos de visita, y la visita anterior (esto) se ubicará directamente en el método de destino.
Las anteriores son las diversas distribuciones en Java y el modelo de visitantes para lograr una distribución dual a través de la forma de patrones. Espero que sea útil para todos. Si tiene alguna pregunta, déjame un mensaje. ¡El editor responderá a todos a tiempo!