Двойная отправка
Что такое двойное распределение?
Говоря о объектно-ориентированном программировании, мы часто говорим о объектно-ориентированном «полиморфизме». Среди них часто есть поговорка о полиморфизме, что «ссылка на родительский класс указывает на объект класса дочернего класса».
Эта ссылка на родительский класс указывает на объекты подкласса, записанная как следующее:
Животное животное = новая собака (); Animal.bark ();
Другая обычно используемая форма
Public Class Keeper {public void говорит (животное a) {System.out.println («Животное говорит»); } public void говорит (Dog Dog) {System.out.println ("собака говорит"); }} Animal Animal = new Animal (); Animal Dog = New Dog (); Keeper Keeper = new Keeper (); хранитель. Сказ (животное); сохранить. Какой контент будет выводиться, когда хранитель выше вызовов будет говорить дважды? Будут ли называться два разных метода?
Фактически, во время этих двух вызовов метод говорится (животное а) будет вызван. Поскольку это содержимое можно найти в период компиляции, это статическое распределение Java.
На приведенном выше рисунке мы видим, что байт -код, сгенерированный двумя вызовами, указывает на метод «Сказ А)». Метод осуществляется напрямую во время выполнения, а соответствующий контент выводится.
Почему соответствующее животное. Bark () в конечном итоге называет метод класса собак? Это должно определить тип конкретного получателя метода во время выполнения и выполнить его. Это называется динамическим распределением, которое определяет конкретные методы во время выполнения и реализует объектно-ориентированный полиморфизм.
Отправлять
Распределение относится к процессу завершения метода, который будет выполнен.
Для статических языков, таких как Java, все они выполняются с помощью отдельного распределения (единичная диспетчерская).
Например, строка кода
dog.eat(new Bone())
Окончательное выполнение метода EAT, который будет выбран, выберет соответствующий метод только в соответствии с конкретным типом собаки, и падебные параметры не могут влиять на выбор соответствующего метода. Это единственная отправка
Чтобы сделать реальные параметры, кость здесь, чтобы действительно сыграть роль, вам нужно использовать двойную отправку или множественную отправку
То есть окончательное решение - это не только приемник метода, но и тип параметров.
Режим посетителя
В режиме проектирования GOF режим посетителя использует двойную отправку для достижения цели вызова реальных объектов.
Для режима посетителя наиболее распространенным примером является обход дерева. Например, существуют различия в способе обработки узлов и листьев. Это делается посредством двойного распределения посетителей для реализации различных элементов и выполнения различного содержимого.
Код выглядит так:
node.accept (new ConceateVisitor ()); Leaf.accep (новый ConceateVisitor ());
Метод принятия в узле снова передаст свой реальный тип обратно в посетитель
public void принять (посетитель v) {v.visit (this); }В настоящее время, в посетителе, вы можете назвать конкретные методы в соответствии с реальным типом, и есть методы, аналогичные способам, соответствующим узлу и листьям:
Публичный void визит (узел N); Публичное визит (лист L);
Посетитель под сумму, он обычно включает в себя интерфейс для посетителей. В интерфейсе посетителя он содержит логику обработки каждого объекта элемента, который будет доступен. В конкретной реализации каждого элемента вы передаете свой собственный тип обратно посетителю для вторичного распределения, чтобы реализовать точный логический вызов.
Приложения в Томкат
Посетитель также используется в Tomcat, как правило, разрабатывает выражения EL.
Например, org.apache.el.parser.node
Этот класс содержит метод Accept (Nodevisitor Visitor)
Есть много фактических типов узлов, но в это время реального звонка он пройдет
public void Accept (Nodevisitor посетитель) бросает исключение {visitor.visit (this);Передача реального типа обратно посетителю, в козырете будет вызван конкретный метод, так что параметры также могут играть решающую роль.
public void Viate (узлы узла) Throws Elexception {if (экземпляр узла astfunction) {astfunction funcnode = (astfunction) node; Метод m = null; } else if (xxx) {} Здесь будет объявлено многочисленные методы посещения, и приведенное выше визит (это) будет расположен непосредственно на целевом методе.
Вышеуказанное представляет собой различные распределения в Java и модели для посетителей для достижения двойного распределения с помощью формы моделей. Я надеюсь, что это будет полезно для всех. Если у вас есть какие -либо вопросы, пожалуйста, оставьте мне сообщение. Редактор ответит всем вовремя!