В чем разница между использованием шаблона Visitor и отдельного класса? - PullRequest
0 голосов
/ 29 августа 2018

Я хотел бы знать, в чем разница между шаблоном Visitor и использованием статического метода для выполнения кода в разделении.

Давайте рассмотрим пример, где я мог бы вызвать шаблон Visitor:

  new AnalyticsVisitor.accept(myClass); 

, и, например, при вызове из myClass работа будет перемещена в посетителя для выполнения. Он бы даже собирал мусор быстрее, если бы он занимал много памяти.

Теперь давайте рассмотрим использование простого метода для достижения более или менее одного и того же:

  new AnalyticsManager.execute(myClass);

Достиг ли я того же?

  1. У меня есть разделение кода.
  2. Я могу применить это к нескольким структурам данных
  3. Я могу добавить информацию в устаревший код, не меняя его.

Так зачем использовать шаблон Visitor, а не просто класс (если только для двойной отправки)?

1 Ответ

0 голосов
/ 29 августа 2018

Этот вопрос все еще немного запутан. Я подозреваю, что вы не поняли цель шаблона «Посетитель».

Как обсуждено здесь шаблон посетителя полезен, когда у вас сложная структура данных (например, дерево разбора), которая относительно стабильна (с точки зрения разработки), но вы хотите иметь возможность продолжать добавлять новые операции над всеми его элементами. Это неуклюже со стандартными методами ОО.


Технология, на которой основан шаблон посетителя, - это двойная диспетчеризация, поэтому, когда вы говорите: «Зачем использовать шаблон посетителя, если только для двойной диспетчеризации?» Вы фактически говорите: «Зачем использовать шаблон посетителя?»


Ваш пример кода включает только клиента, поэтому неясно, что на самом деле предлагает ваша новая техника.

Предоставленный код выглядит задом наперед для реального шаблона посетителя. Должно быть:

my_datastructure.accept(analytics_visitor);

где analytics_visitor наследуется от MyDataStructureVisitor и предоставляет отдельные методы для каждого из типов элементов, которые может содержать структура данных.


Что касается достижений:

  1. «Разделение кода» - неопределенный термин. Шаблон посетителя позволяет определять структуру данных без определения всех операций (предполагаемых методов). Вместо этого они могут быть определены отдельно - со стоимостью более плохой инкапсуляции.)

  2. Непонятно, что значит применить шаблон посетителя к нескольким структурам данных. Каждый класс посетителей связан с одной структурой данных.

  3. Цель состоит не в том, чтобы добавить «информацию» в устаревший код. Это добавление операций к устаревшему коду.

...