SBC | Паттерн Стратегия
27135
post-template-default,single,single-post,postid-27135,single-format-standard,ajax_fade,page_not_loaded,,qode_grid_1200,transparent_content,qode-theme-ver-13.9,qode-theme-bridge,disabled_footer_top,disabled_footer_bottom,wpb-js-composer js-comp-ver-5.4.7,vc_responsive
 

Паттерн Стратегия

Паттерн Стратегия

алгоритмов

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

работы

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

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

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

Чем стратегия лучше переопределения методов в наследниках?

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

паттерны

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

Обычного наследования недостаточно: зачем использовать паттерн «Стратегия» в разработке

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

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

Когда использовать стратегию?

Мост, https://goforex.info/ и Состояние (а также слегка и Адаптер) имеют схожие структуры классов — все они построены на принципе «композиции», то есть делегирования работы другим объектам. Тем не менее, они отличаются тем, что решают разные проблемы. Помните, что паттерны — это не только рецепт построения кода определённым образом, но и описание проблем, которые привели к данному решению. Паттерн Strategy переносит в отдельную иерархию классов все детали, связанные с реализацией алгоритмов. Для случая программы сжатия файлов абстрактный базовый класс Compression этой иерархии объявляет интерфейс, общий для всех алгоритмов и используемый классом Compressor.

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

паттерн стратегия

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

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

Итак, стратегия — это не что иное, как обычное делегирование с возможностью выбора конкретной реализации делегата с определенным интерфейсом из существующего набора. Число классов в системе, построенной с применением паттерна Strategy, возрастает. Реализация алгоритма жестко привязана к его подклассу, что затрудняет поддержку и расширение такой системы. Определите алгоритм, который подвержен частым изменениям. Также подойдёт алгоритм, имеющий несколько вариаций, которые выбираются во время выполнения программы.

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

Принцип SOLID, который все понимают неправильно: что такое единая ответственность в разработке

Интерфейс IStrategy, который определяет метод Algorithm(). Это общий интерфейс для всех реализующих его алгоритмов. Вместо интерфейса здесь также можно было бы использовать абстрактный класс.

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

Систему проще поддерживать и модифицировать, так как семейство алгоритмов перенесено в отдельную иерархию классов. Классы ConcreteStrategy1 и ConcreteStrategy, которые реализуют интерфейс IStrategy, предоставляя свою версию метода Algorithm(). Подобных классов-реализаций может быть множество. Стратегия меняет поведение объекта «изнутри», а Декоратор изменяет его «снаружи». Команду используют, чтобы превратить любые разнородные действия в объекты. Этот объект теперь можно логировать, хранить в истории для отмены, передавать во внешние сервисы и так далее.

В результате получаем набор родственных классов с общим интерфейсом и различными реализациями алгоритмов. Когда вы не хотите обнажать детали реализации алгоритмов для других классов. Когда вам нужно использовать разные вариации какого-то алгоритма внутри одного объекта.

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

No Comments

Sorry, the comment form is closed at this time.