Стратегия шаблон проектирования Программирование на C, C# и Java

Подклассы ZIP_Compression, ARJ_Compression и RAR_Compression его реализуют в соответствии с тем или иным алгоритмом. Класс Compressor содержит указатель на объект абстрактного типа Compression и предназначен для переадресации пользовательских запросов конкретному алгоритму. Для замены одного алгоритма другим достаточно перенастроить этот указатель на объект нужного типа.

  • И, кстати, некоторые из них (к примеру, тот же „Мост“) используют тот или иной алгоритм в зависимости от контекста.
  • Постараюсь донести до вас принципы и суть шаблона без воды, и покажу как его применять на практике.
  • Вы выбираете конкретную стратегию в зависимости от контекста — наличия денег или времени до отлёта.
  • Когда у вас есть множество похожих классов, отличающихся только некоторым поведением.
  • Неоправданное их использование может привести к усложнению программного кода,
    уменьшению его качества.

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

Хотя каждый класс будет прокладывать маршрут по-своему, для навигатора это не будет иметь никакого значения, так как его работа заключается только в отрисовке маршрута. Навигатору достаточно подать в стратегию данные о начале и конце маршрута, чтобы получить массив точек маршрута в оговорённом формате. Одной из самых востребованных функций являлся поиск и прокладывание маршрутов. Пребывая в неизвестном ему городе, пользователь должен иметь возможность указать начальную точку и пункт назначения, а навигатор — проложит оптимальный путь.

Причем лучше не сразу
взять какой-то определенный паттерн – первый, который показался нужным, а посмотреть на несколько родственных паттернов из одной группы, которые решают одну и ту же задачу. Если функционал поиска и фильтрации с квартирами на продажу было довольно легко реализовать, то любые новые изменения вызывали много вопросов и головную боль по архитектуре. Вы понимали, что любое изменение алгоритмов выдачи нужных квартир и элементов для отображения затрагивает основные базовые классы, в которых реализован весь функционал фильтрации. Основной функционал поиска квартир изначально был реализован в одном классе, при добавлении нового функционала этот класс разрастался, вы добавляли новые условия, новые ветвления, новые методы и функции. Библиотека ATL содержит в себе набор классов threading model, которые являются стратегиями (различными реализациями Lock/Unlock, которые потом используются основными классами системы).

Код ревью:

Реализация паттерна «Стратегия» позволяет более гибко использовать полиморфизм поведения объекта без необходимости дублирования кода и наращивания уровней иерархии наследования. Как пишут в Википедии, стратегия — это поведенческий шаблон проектирования, предназначенный для определения семейства алгоритмов, инкапсуляции каждого из них и обеспечения их взаимозаменяемости. Чтобы работа нашего класса была одинаковой для разного поведения, у объектов-стратегии должен быть общий интерфейс. Используя такой интерфейс вы делаете независимым наш класс-контекста от классов-стратегий.

И в конечном счете надо придерживаться принципа KISS (Keep It Simple, Stupid) – сохранять код программы по возможности простым и ясным. Ведь
смысл паттернов не в усложнении кода программы, а наоборот в его упрощении. И в данном руководстве мы рассмотрим наиболее основные и распространенные паттерны и принципы их использования применительно к языку C#. Существуют и другие классификации паттернов в зависимости от того, относится паттерн к классам или объектам. Причем паттерны, как правило, не зависят от языка программирования. Их принципы применения будут аналогичны и в C#, и в Jave, и в других языках.

  • Чтобы сменить алгоритм, вам будет достаточно подставить в контекст другой объект-стратегию.
  • Если в будущем появится необходимость реализации нескольких вариантов поведения, можно реализовать интерфейс для поведения и перейти к паттерну «Стратегия».
  • Если с популярностью навигатора не было никаких проблем, то техническая часть вызывала вопросы и периодическую головную боль.
  • Я пытался подойти к этому шаблону с разных сторон, но так и не понял его, пока не пришел к тому, что я его уже использую в своем коде.
  • Используя этот интерфейс, контекст будет независимым от конкретных классов стратегий.
  • Если есть поведение, то должен быть интерфейс, его реализация, и эта реализация должна внедряться как зависимость.

Сегодня хочу с вами поговорить про шаблон проектирования Стратегия (Strategy). Постараюсь донести до вас принципы и суть шаблона без воды, и покажу как его применять на практике. Стратегия позволяет вынести отличающееся поведение в отдельную иерархию классов, а затем свести первоначальные классы к одному, сделав поведение этого класса настраиваемым. паттерн стратегия В нашем примере каждый алгоритм поиска пути переедет в свой собственный класс. В этих классах будет определён лишь один метод, принимающий в параметрах координаты начала и конца пути, а возвращающий массив точек маршрута. Любое изменение алгоритмов поиска, будь то исправление багов или добавление нового алгоритма, затрагивало основной класс.

Проектирование пользовательского интерфейса:

В шаблоне проектирование „Стратегия“ в основе лежит способ добавления-подмены объектов во время выполнения программы. Возможно минимальный пример Стратегия наилучшим образом иллюстрирует этот принцип и по этому его отражение Вы и видите в других шаблонах. Но на самом деле у этого архитектурного решения есть более низкоуровневое абстрактное определение и называется оно „Агрегация“. Начать можно с обычного делегирования, чтобы отделить поведение от данных и вынести реализацию поведения в отдельный объект. Если в будущем появится необходимость реализации нескольких вариантов поведения, можно реализовать интерфейс для поведения и перейти к паттерну «Стратегия».

Стратегия

Как видите, мы можем управлять вызовом разных алгоритмов в зависимости от контекста и пользовательских фильтров. Алгоритмы могут создавать ветвления в зависимости от входных фильтров и других параметров, переданных из клиентского кода в методы, реализующие конкретные алгоритмы. Паттерн Стратегия (Strategy) представляет шаблон проектирования, который определяет набор алгоритмов, инкапсулирует каждый из них
и обеспечивает их взаимозаменяемость. В зависимости от ситуации мы можем легко заменить один используемый алгоритм другим. При этом замена
алгоритма происходит независимо от объекта, который использует данный алгоритм. Рассмотрим такой поведенческий шаблон проектирования, как Стратегия (Strategy).

Когда применять?

После того, как пользователь выбрал интересующий его тип недвижимости в фильтрах на сайте, будет происходить запрос в контроллер на backend, с экшеном получения данных по входящим фильтрам и типам пользователя. Паттерн Strategy переносит в отдельную иерархию классов все детали, связанные с реализацией алгоритмов. Для случая программы сжатия файлов абстрактный базовый класс Compression этой иерархии объявляет интерфейс, общий для всех алгоритмов и используемый классом Compressor.

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

Design patter Strategy  или шаблон проектирования Стратегия  относится к поведенческим шаблонам проектирования. Его задача – выделить схожие алгоритмы, решающие конкретную задачу. Реализация алгоритмов выносится в отдельные классы и предоставляется возможность выбирать алгоритмы во время выполнения программы. Данный метод определяет общее поведение для конкретных алгоритмов, реализующих разные стратегии. Метод может принимать различные аргументы, позволяющие реализовать ветвления в ваших алгоритмах. Прежде всего при решении какой-нибудь проблемы надо выделить все используемые сущности и связи между ними и абстрагировать их от конкретной
ситуации.

Nie je možné pridávať komentáre.