Despacho duplo
O que é distribuição dupla?
Ao falar sobre programação orientada a objetos, geralmente falamos sobre o "polimorfismo" orientado a objetos. Entre eles, muitas vezes há um ditado sobre o polimorfismo de que "a referência da classe dos pais aponta para o objeto da classe infantil".
Esta referência de classe pai aponta para objetos de subclasse é escrita como o seguinte:
Animal animal = novo cachorro (); Animal.Bark ();
Outra forma comumente usada é
public class Keeper {public void diz (animal a) {System.out.println ("Animal diz"); } public void diz (cachorro) {System.out.println ("Dog Says"); }} Animal animal = novo animal (); Cão de animais = novo cachorro (); Keeper Keeper = new Keeper (); Keeper.Say (animal); Keep.Say (cachorro); Qual conteúdo será produzido quando o goleiro acima das chamadas dizem duas vezes? Dois métodos diferentes serão chamados?
De fato, durante essas duas chamadas, o método diz (Animal A) será chamado. Como esses conteúdos podem ser encontrados no período de compilação, essa é a distribuição estática do Java.
A partir da figura acima, podemos ver que o bytecode gerado pelas duas chamadas aponta para o método Say (Animal A). O método é executado diretamente em tempo de execução e o conteúdo correspondente é emitido.
Por que o animal correspondente.Bark () acaba chamando o método da aula de cães? Isso é para determinar o tipo de destinatário do método específico em tempo de execução e executá -lo. Isso é chamado de distribuição dinâmica, que determina métodos específicos em tempo de execução e implementa o polimorfismo orientado a objetos.
Expedição
A distribuição refere -se ao processo de finalização de um método a ser executado.
Para idiomas estáticos como o Java, todos são executados por meio de distribuição única (despacho único).
Por exemplo, uma linha de código
dog.eat(new Bone())
A execução final do método EAT a ser selecionado selecionará apenas o método correspondente de acordo com o tipo específico do cão, e os parâmetros passados não podem afetar a seleção do método correspondente. Este é um único despacho
Para fazer com que os parâmetros reais fossem passados, o Bone está aqui para realmente desempenhar um papel, você precisa usar o Double Despacho ou Múltiplo
Ou seja, a decisão final não é apenas o receptor do método, mas também o tipo de parâmetro.
Modo de visitante
No modo de design do GOF, o modo de visitante usa despacho duplo para alcançar o objetivo de chamar objetos reais.
Para o modo de visitante, o exemplo mais comum é a travessia de árvores. Por exemplo, existem diferenças na maneira de processar nós e folhas. Isso é feito através da dupla distribuição do visitante para implementar diferentes elementos e executar diferentes conteúdos.
O código se parece com o seguinte:
Node.Acept (novo concretovisitor ()); leaf.cecept (novo concretovisitor ());
O método de aceitação no nó passará seu tipo real de volta ao visitante novamente
public void aceit (visitante v) {v.visit (this); }No momento, no visitante, você pode chamar métodos específicos de acordo com o tipo real, e existem métodos semelhantes aos correspondentes ao nó e folha:
visita pública de vazio (nó n); visita pública de vazio (folha L);
Visitante para resumir, geralmente inclui a interface do visitante. Na interface do visitante, ele contém a lógica de processamento de cada objeto de elemento a ser acessado. Na implementação específica de cada elemento, você passa seu próprio tipo de volta ao visitante para distribuição secundária para implementar a chamada lógica exata.
Aplicações no Tomcat
O visitante também é usado no tomcat, normalmente analisando expressões de EL.
Por exemplo, org.apache.el.parser.node
Esta classe contém um método de aceitação (visitante nodEvisitor)
Existem muitos tipos de nós reais, mas neste momento de chamada real, ele passará
public void aceit (visitante nodEvisitor) lança exceção {visitor.visit (this);Passando o tipo real de volta ao visitante, um método específico será chamado no visor, para que os parâmetros também possam desempenhar um papel decisivo.
public void visit (nó nó) lança a elexception {if (instância do nó de astfunção) {Astfunção funcnode = (Astfunção) nó; Método m = nulo; } else if (xxx) {} Aqui, vários métodos de visita serão declarados, e a visita acima (isso) estará diretamente localizada no método de destino.
O exposto acima são as várias distribuições em Java e o modelo de visitante para obter uma distribuição dupla através da forma de padrões. Espero que seja útil para todos. Se você tiver alguma dúvida, deixe -me uma mensagem. O editor responderá a todos a tempo!