В чем разница между шаблоном посетителя и стратегии?

Я изучил оба шаблона, но не понял различий между этими двумя шаблонами.

Я не знаю сценариев, когда и где использовать эти шаблоны.

Может ли кто-нибудь объяснить различия и варианты использования?

Ответ 1

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

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

Ответ 2

Шаблон посетителя используется для перемещения иерархии объектов и предоставления некоторых функций, таких как печать или отчетность и т.д. Я использовал это, чтобы предоставить различные форматы (текст/HTML) для печати иерархии объектов, написав несколько посетителей, по одному для каждого формата. Объекты в иерархии являются посетителями.

Стратегический шаблон используется для выбора конкретного логического пути на основе ввода. Классическим примером являются фильтры проверки подлинности, в которых на основе значения в заголовке Authorization HTTP выбираются и запускаются разные стратегии аутентификации, такие как NTLM/Negotiate/Basic. Фильтр будет содержать ссылку на интерфейс AuthenticationStrategy, на основе входящего запроса, определенную стратегию аутентификации выбирается и присваивается этой ссылке, а следующий код не должен знать, какая именно стратегия используется.

Ответ 3

Цель шаблона посетителя:

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

Использовать шаблон посетителя, если:

  • Подобные операции должны выполняться на объектах разных типов, сгруппированных в структуру
  • Вам нужно выполнить много разных и не связанных действий. Он отделяет операцию от объектов Структура
  • Новые операции должны быть добавлены без изменения структуры объекта.
  • Соберите связанные операции в один класс, а не заставляйте вас изменять или выводить классы.
  • Добавить функции в библиотеки классов, для которых у вас либо нет источника, либо невозможно изменить источник

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

Если новый объект Visitable добавлен, он требует изменения кода в классах Visitor и ConcreteVisitor. Для решения этой проблемы необходимо обходное решение: использовать отражение, которое будет влиять на производительность.

Обратитесь к oodesign article и sourcemaking статьи для более подробной информации

Цель стратегии:

Определите семейство алгоритмов, инкапсулируйте каждый из них и сделайте их взаимозаменяемыми. Стратегия позволяет алгоритму варьироваться независимо от клиентов, которые его используют.

Стратегия

позволяет вам изменить кишки объекта.

Для получения более подробной информации см. ниже вопросы SE:

Реальный мир Пример шаблона стратегии

Ответ 4

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

Например, посетитель знает о конкретных классах. Таким образом, вы будете более гибкими за счет изменения кода посетителя при добавлении в иерархию новых конкретных классов. В Стратегии нет такой вещи. В этом контексте стратегия становится более подходящей, если у вас есть методы только для возврата некоторого вывода с заданным входом, независимо от контекста.

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

Ответ 5

Посетитель предназначен для тех случаев, когда у вас есть семейство классов, и вам нужно добавлять новые функции для каждого класса в этом семействе, но не касаться самих классов (или хотите, чтобы эта новая функциональность была определена в одно место - посетитель)

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