Я изучил оба шаблона, но не понял различий между этими двумя шаблонами.
Я не знаю сценариев, когда и где использовать эти шаблоны.
Может ли кто-нибудь объяснить различия и варианты использования?
Я изучил оба шаблона, но не понял различий между этими двумя шаблонами.
Я не знаю сценариев, когда и где использовать эти шаблоны.
Может ли кто-нибудь объяснить различия и варианты использования?
Основное отличие состоит в том, что шаблон стратегии инкапсулирует одну группу связанных действий, а шаблон Visitor инкапсулирует несколько таких групп.
Шаблон посетителя используется для перемещения иерархии объектов и предоставления некоторых функций, таких как печать или отчетность и т.д. Я использовал это, чтобы предоставить различные форматы (текст/HTML) для печати иерархии объектов, написав несколько посетителей, по одному для каждого формата. Объекты в иерархии являются посетителями.
Стратегический шаблон используется для выбора конкретного логического пути на основе ввода. Классическим примером являются фильтры проверки подлинности, в которых на основе значения в заголовке Authorization
HTTP выбираются и запускаются разные стратегии аутентификации, такие как NTLM/Negotiate/Basic. Фильтр будет содержать ссылку на интерфейс AuthenticationStrategy, на основе входящего запроса, определенную стратегию аутентификации выбирается и присваивается этой ссылке, а следующий код не должен знать, какая именно стратегия используется.
Цель шаблона посетителя:
Представление операции, выполняемой над элементами структуры объекта. Посетитель позволяет вам определить новую операцию без изменения классов элементов, на которых она работает.
Использовать шаблон посетителя, если:
Несмотря на то, что шаблон Visitor обеспечивает гибкость для добавления новой операции без изменения существующего кода в Object, эта гибкость имеет недостаток.
Если новый объект Visitable добавлен, он требует изменения кода в классах Visitor и ConcreteVisitor. Для решения этой проблемы необходимо обходное решение: использовать отражение, которое будет влиять на производительность.
Обратитесь к oodesign article и sourcemaking статьи для более подробной информации
Цель стратегии:
СтратегияОпределите семейство алгоритмов, инкапсулируйте каждый из них и сделайте их взаимозаменяемыми. Стратегия позволяет алгоритму варьироваться независимо от клиентов, которые его используют.
позволяет вам изменить кишки объекта.
Для получения более подробной информации см. ниже вопросы SE:
В дополнение к поведенческой разнице, упомянутой выше, я также испытал разницу в отношении зависимостей и вариантов использования во время проекта, когда я работал, например, следующим образом.
Например, посетитель знает о конкретных классах. Таким образом, вы будете более гибкими за счет изменения кода посетителя при добавлении в иерархию новых конкретных классов. В Стратегии нет такой вещи. В этом контексте стратегия становится более подходящей, если у вас есть методы только для возврата некоторого вывода с заданным входом, независимо от контекста.
Кроме того, шаблон Visitor также используется для реализации SRP SOLID, чтобы разделить проблемы.
Посетитель предназначен для тех случаев, когда у вас есть семейство классов, и вам нужно добавлять новые функции для каждого класса в этом семействе, но не касаться самих классов (или хотите, чтобы эта новая функциональность была определена в одно место - посетитель)
Стратегия предназначена для тех случаев, когда у вас есть семейство классов, которые должны быть способны что-то сделать для правильной работы (например, сортировать некоторые объекты, которые они содержат), но вы хотите, чтобы клиент или ваша зависимость чтобы рассказать им, как это сделать.