Определение посетителя: операция, которая действует на каждом объекте в определенной группе объектов. Это позволяет вам определять новые операции, которые действуют на эти объекты, не изменяя их сами.
В Java шаблон посетителей фактически разделяет элементы в структуре сбора и поведение работы на этих элементах.
Зачем использовать режим посетителя
Коллекция Java (включая Vector и Hashtable) - это технология, которую мы используем чаще всего, но коллекция, по -видимому, представляет собой большой черный чан с красителем. Затем мы должны использовать, если судить, например:
Кода -копия выглядит следующим образом:
Iterator iterator = collection.iterator ()
while (iterator.hasnext ()) {
Объект o = iterator.next ();
if (o экземпляр коллекции)
MessyPrintCollection ((Collection) O);
else if (o encessOf String)
System.out.println ("'"+o.toString ()+"'");
иначе if (o экземпляр float)
System.out.println (o.toString ()+"f");
еще
System.out.println (o.toString ());
}
В приведенном выше примере мы использовали экземпляр для определения типа O.
Очевидно, что недостатки в том, чтобы сделать это, если еще, если код громоздкий, мы можем решить его с помощью режима посетителя.
Как использовать режим посетителей
Для приведенного выше примера мы разрабатываем посетителя посетителя интерфейса:
Кода -копия выглядит следующим образом:
Посетитель общественного интерфейса
{
public void visitcollection (коллекция коллекции);
public void Visitstring (String String);
Public void VisitFloat (Float Float);
}
В этом интерфейсе поместите типы классов, которые, по нашему мнению, возможны.
С посетителями нас нужно посетить. Не приветствует его, посетитель не сможет посетить).
Мы определяем этот интерфейс как посещаемый, который должен определить операцию принятия, то есть сделать каждый элемент коллекции доступным.
Кода -копия выглядит следующим образом:
Публичный интерфейс визит {
public void принять (посетитель);
}
Хорошо, с двумя интерфейсами, нам нужно определить их конкретную реализацию (бетонный класс):
Кода -копия выглядит следующим образом:
ConcreteElement Public Class реализует посещение
{
частное строковое значение;
Public ConcreteElement (String String) {
value = string;
}
// Определить конкретное содержание принять здесь - очень простое предложение, чтобы назвать публичное void Accept (посетитель посетителя) {
Visitor.visitstring (это);
}
}
Давайте посмотрим на конкретную реализацию посетителя:
Кода -копия выглядит следующим образом:
общественный класс ConceteVisitor реализует посетителя
{
// В этом методе мы реализуем успешный доступ к элементам коллекции public void vesitcollection (collection collection) {
Iterator iterator = collection.iterator ()
while (iterator.hasnext ()) {
Объект o = iterator.next ();
if (o экземпляр визита)
((Посещение) o) .accept (это);
}
public void VisitString (String String) {
System.out.println ("''"+String+"'");
}
public void visitfloat (float float) {
System.out.println (float.toString ()+"f");
}
}
В приведенном выше посещениях мы реализуем доступ к каждому элементу коллекции, используя только одно утверждение суждения, просто чтобы определить, доступен ли он.
На этом этапе мы завершили основную архитектуру модели для посетителей.
Предварительные условия для использования режима для посетителей
Тип объекта в структуре группы объектов редко изменяется, то есть тип идентификации посетителя редко изменяется, например, тип в посетителе выше, редко изменяется, если необходимы новые операции, например, в примере выше, мы В дополнение к специфической реализации бетона, также необходим новый ConcretElement2 ConcretElement3.
Видно, что существует предпосылка для использования режима для посетителей.
Если посетитель также часто меняется, то есть типы объектов в группе объектов часто изменяются, общее предположение заключается в том, что лучше определять операции один за другим в этих классах объектов, но технология Java отражает эту проблему.