Шаблон посетителя

Когда я читаю о шаблоне посетителя, он говорит как

Позволяет применять одну или несколько операций к набору объектов во время выполнения, отделяя операции от структуры объекта.

Если мое предположение верно, мы определим абстрактного посетителя, который содержит методы для обработки каждого объекта. Тогда конкретный посетитель будет реализовывать каждый из этих методов. Этим мы отделяем логику обработки объектов от класса Object до реализации посетителя.

Я сомневаюсь, что если у нас есть только одна реализация посетителя, нам действительно нужно использовать этот шаблон? мы не можем просто поместить реализацию в каждый класс Object и вызвать ее напрямую? Пожалуйста, поправьте меня, если я что-то пропущу.

3 ответа

На самом деле вам никогда не нужно использовать этот шаблон или любой другой шаблон. Если вы используете шаблоны, потому что вы делаете выбор дизайна на основе вашего контекста.

Некоторые элементы документации шаблона предназначены для того, чтобы помочь вам принять обоснованное решение об использовании шаблона или нет. В частности, проверьте эти разделы:

  • Намерение: описание цели, стоящей за шаблоном, и причины его использования.
  • Мотивация (Силы): сценарий, состоящий из проблемы и контекста, в котором этот шаблон может быть использован.
  • Применимость: ситуации, в которых этот шаблон можно использовать; контекст для шаблона.
  • Последствия: описание результатов, побочных эффектов и компромиссов, вызванных использованием шаблона.

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

Поэтому прочитайте еще раз документацию по шаблону, проверьте свой программный контекст и примите обоснованное решение об его использовании или нет.

Я не согласен.

Не всегда возможно или желательно поместить логику в объект, а не помещать его в посетителя. Например, постоянный объект (Пользователь или Заказ), часть уровня "домен", не обязательно имеет доступ (или не должен иметь доступ) к услугам (часть уровня "служба"), которые необходимо выполнить операцию: выставить счет на заказ или продвинуть пользователя.

Кроме того, тот факт, что теперь только один посетитель, не означает, что другие не появятся позже.

Целью шаблона является разделение. Поместив операцию в сам посещаемый объект, у вас больше не будет развязки.

Развязывая, вы также создаете API многократного использования. Разработчик, использующий ваши классы, вполне может быть не в состоянии изменить их, потому что у него просто нет исходного кода и, следовательно, он не может его изменить. Тем не менее он должен быть в состоянии сделать что-то другое в зависимости от фактического конкретного класса объекта. Отсюда и шаблон посетителя.

Ваше описание шаблона посетителя говорит само за себя:

Отделение операций от структуры объекта

В хорошо отделенном мире у вас будут объекты, содержащие данные, и объекты, которые работают с данными. Целью паттерна "Посетитель" является их разделение. Вероятно, это не тот шаблон, который вы будете часто видеть в явном виде, однако основной принцип, который вы увидите повсюду.

Развязывая операции, вы используете O в SOLID ( принцип Open/Closed), в котором говорится, что вы можете изменить его поведение без изменения исходного кода. Потому что, если вы хотите иметь новые / удалить / изменить операции на вашем объекте, вы просто добавляете / удаляете / изменяете посетителя этого объекта вместо самого объекта.

Другие вопросы по тегам