Strategy Design Pattern Хабр

S t r a t e g y D e s i g n P a t t e r n Х а б р

Facebook
Twitter
LinkedIn

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

Проблема

  1. Стратегия помещает каждую лапу такого оператора в отдельный класс-стратегию.
  2. Навигатору достаточно подать в стратегию данные о начале и конце маршрута, чтобы получить массив точек маршрута в оговорённом формате.
  3. Когда у вас есть множество похожих классов, отличающихся только некоторым поведением.
  4. Вы понимали, что любое изменение алгоритмов выдачи нужных квартир и элементов для отображения затрагивает основные базовые классы, в которых реализован весь функционал фильтрации.
  5. У него должен быть конструктор, принимающий активный в данный момент объект-стратегии и сеттер setStrategy, устанавливающий активную стратегию.

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

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

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

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

Strategy Design Pattern

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

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

В чем проблема?

Аналогичное можно проделать и с классами работы с элементами интерфейса для различных видов пользователей. После того, как пользователь выбрал интересующий его тип недвижимости в фильтрах на сайте, будет происходить запрос в контроллер на backend, с экшеном получения данных по входящим фильтрам и типам пользователя. Используя этот интерфейс, контекст будет независимым от конкретных классов стратегий. С другой стороны, вы сможете изменять и добавлять новые виды алгоритмов, не трогая код контекста. Design patter Strategy  или шаблон проектирования Стратегия  относится к поведенческим шаблонам проектирования. Его задача – выделить схожие алгоритмы, решающие конкретную задачу.

Задача контроллера определить класс-стратегию и запросить у класса-контекста данные для отображения, передав ему известный набор фильтров. Класс-контекст в этой схеме  – это класс, которые реализует метод поиска квартир по заданным фильтрам. На диаграмме классов выше мы видим, что класс контекста определяет метод getData, и принимает аргументы filters. У него должен быть конструктор, принимающий активный в данный момент объект-стратегии и сеттер setStrategy, устанавливающий активную стратегию.

Используя такой интерфейс вы делаете независимым наш класс-контекста от что такое ограниченные осцилляторы классов-стратегий. Но тут приходят к вам Product Manager’ы и говорят, что нужно добавить возможность искать и отображать недвижимость, которая сдается в аренду. У нас появляется еще один тип пользователя – арендаторы.

Katerina Monroe
Katerina Monroe

@katerinam •  More Posts by Katerina

Congratulations on the award, it's well deserved! You guys definitely know what you're doing. Looking forward to my next visit to the winery!

Leave a Reply

Your email address will not be published. Required fields are marked *