Содержание
Стратегия помещает каждую лапу такого оператора в отдельный класс-стратегию. Затем контекст получает определённый объект-стратегию от клиента и делегирует ему работу. Если вдруг понадобится сменить алгоритм, в контекст можно подать другую стратегию. Стратегия позволяет изолировать код, данные и зависимости алгоритмов от других объектов, скрыв эти детали внутри классов-стратегий. Стратегия позволяет варьировать поведение объекта во время выполнения программы, подставляя в него различные объекты-поведения (например, отличающиеся балансом скорости и потребления ресурсов). Контекст хранит ссылку на объект конкретной стратегии, работая с ним через общий интерфейс стратегий.
Число классов в системе, построенной с применением паттерна Strategy, возрастает. Реализация алгоритма жестко привязана к его подклассу, что затрудняет поддержку и расширение такой системы. Определите алгоритм, который подвержен частым изменениям. Также подойдёт алгоритм, имеющий несколько вариаций, которые выбираются во время выполнения программы. В этом примере контекст использует Стратегию для выполнения той или иной арифметической операции. Если есть поведение, то должен быть интерфейс, его реализация, и эта реализация должна внедряться как зависимость.
Мост, Стратегия и Состояние (а также слегка и Адаптер) имеют схожие структуры классов — все они построены на принципе «композиции», то есть делегирования работы другим объектам. Тем не менее, они отличаются тем, что решают разные проблемы. Помните, что паттерны — это не только рецепт построения кода определённым образом, но и описание проблем, которые привели к данному решению. Паттерн Strategy переносит в отдельную иерархию классов все детали, связанные с реализацией алгоритмов. Для случая программы сжатия файлов абстрактный базовый класс Compression этой иерархии объявляет интерфейс, общий для всех алгоритмов и используемый классом Compressor. Подклассы ZIP_Compression, ARJ_Compression и RAR_Compression его реализуют в соответствии с тем или иным алгоритмом.
В этих классах будет определён лишь один метод, принимающий в параметрах координаты начала и конца пути, а возвращающий массив точек маршрута. Реализацию на PHP приводить не буду, так как она довольно простая, если понять суть применения паттерна на практике. Проблему может вызвать только необходимость иметь что-то вроде фабрики или фабричного метода для создания нужной реализации конкретного поведения объекта. Но это можно легко сделать при помощи механизма внедрения зависимостей , без которого не обходится ни один проект. Стратегия позволяет вынести отличающееся поведение в отдельную иерархию классов, а затем свести первоначальные классы к одному, сделав поведение этого класса настраиваемым. Паттерн Стратегия предлагает определить семейство схожих алгоритмов, которые часто изменяются или расширяются, и вынести их в собственные классы, называемые стратегиями.
Программная реализация паттерна «Стратегия»
Возможно, стоит вернуться к этому материалу позже. Все это, конечно, хорошо, но зачем все это нужно? Ведь такая реализация приводит к тому, что мы усложняем статический анализ кода, пряча конкретную реализацию поведения за интерфейсом и используемым механизмом внедрения зависимостей. Паттерн Strategy позволяет скрыть детали реализации алгоритмов от клиента. Система, построенная на основе наследования, является статичной.
- Стратегия позволяет варьировать поведение объекта во время выполнения программы, подставляя в него различные объекты-поведения (например, отличающиеся балансом скорости и потребления ресурсов).
- В нашем примере каждый алгоритм поиска пути переедет в свой собственный класс.
- Для правильной настройки системы пользователь должен знать об особенностях всех алгоритмов.
- Возможно, стоит вернуться к этому материалу позже.
Если с популярностью навигатора не было никаких проблем, то техническая часть вызывала вопросы и периодическую головную боль. С каждым новым алгоритмом код основного класса навигатора увеличивался вдвое. В таком большом классе стало довольно трудно ориентироваться. Первая версия вашего навигатора могла прокладывать маршрут лишь по дорогам, поэтому отлично подходила для путешествий на автомобиле.
Обычного наследования недостаточно: зачем использовать паттерн «Стратегия» в разработке
Сделать это можно на этапе создания объекта, просто передав в конструктор требуемый экземпляр реализации поведения. Паттерн Стратегия представляет шаблон проектирования, который определяет набор алгоритмов, инкапсулирует каждый из них и обеспечивает их взаимозаменяемость. В зависимости от ситуации мы можем легко заменить один используемый алгоритм другим. При этом замена алгоритма происходит независимо от объекта, который использует данный алгоритм.
портфель форекс Compressor содержит указатель на объект абстрактного типа Compression и предназначен для переадресации пользовательских запросов конкретному алгоритму. Для замены одного алгоритма другим достаточно перенастроить этот указатель на объект нужного типа. Важно, чтобы все стратегии имели общий интерфейс. Используя этот интерфейс, контекст будет независимым от конкретных классов стратегий.
Стратегия
Систему проще поддерживать и модифицировать, так как семейство https://fxdu.ru/ перенесено в отдельную иерархию классов. Классы ConcreteStrategy1 и ConcreteStrategy, которые реализуют интерфейс IStrategy, предоставляя свою версию метода Algorithm(). Подобных классов-реализаций может быть множество. Стратегия меняет поведение объекта «изнутри», а Декоратор изменяет его «снаружи». Команду используют, чтобы превратить любые разнородные действия в объекты.
Паттерн Strategy предоставляет возможность замены одного алгоритма другим в процессе выполнения программы. Объектно-ориентированный дизайн такой программы может быть построен на идее использования полиморфизма. В результате получаем набор родственных классов с общим интерфейсом и различными реализациями алгоритмов. Когда вы не хотите обнажать детали реализации алгоритмов для других классов. Когда вам нужно использовать разные вариации какого-то алгоритма внутри одного объекта. Для контекста неважно, какая именно вариация алгоритма будет выбрана, так как все они имеют одинаковый интерфейс.
Результаты применения паттерна Strategy
Постараюсь изложить свой ход мысли, возможно, он будет понятнее, чем сухие выдержки из сборников паттернов, которые все пытаются подать в том или ином виде при его рассмотрении. Клиент должен знать, в чём состоит разница между стратегиями, чтобы выбрать подходящую. Усложняет программу за счёт дополнительных классов. Через некоторое время выяснилось, что некоторые люди предпочитают ездить по городу на общественном транспорте. Поэтому вы добавили и такую опцию прокладывания пути.
Нужно идти от простого к сложному, всегда оставляя место для шага вперед. Если перекрывать в наследнике реализацию поведенческого метода родителя. Для правильной настройки системы пользователь должен знать об особенностях всех алгоритмов. Приведем реализацию приложения для сжатия файлов, спроектированного с применением паттерна Strategy. Применение паттерна Strategy позволяет устранить указанные недостатки. Класс Context хранит ссылку на объект IStrategy и связан с интерфейсом IStrategy отношением агрегации.
Заменить один алгоритм на другой в ходе выполнения программы уже невозможно. С другой стороны, Стратегия описывает разные способы произвести одно и то же действие, позволяя взаимозаменять эти способы в каком-то объекте контекста. Изолирует код и данные алгоритмов от остальных классов. Клиенты контекста должны подавать в него соответствующий объект-стратегию, когда хотят, чтобы контекст вёл себя определённым образом. Конкретные стратегии реализуют различные вариации алгоритма.
Состояние можно рассматривать как надстройку над Стратегией. Оба паттерна используют композицию, чтобы менять поведение основного объекта, делегируя работу вложенным объектам-помощникам. Однако в Стратегии эти объекты не знают друг о друге и никак не связаны.
Этот объект теперь можно логировать, хранить в истории для отмены, передавать во внешние сервисы и так далее. Создайте интерфейс стратегий, описывающий этот алгоритм. Он должен быть общим для всех вариантов алгоритма. Одной из самых востребованных функций являлся поиск и прокладывание маршрутов. Пребывая в неизвестном ему городе, пользователь должен иметь возможность указать начальную точку и пункт назначения, а навигатор — проложит оптимальный путь. Итак, стратегия — это не что иное, как обычное делегирование с возможностью выбора конкретной реализации делегата с определенным интерфейсом из существующего набора.
Навигатору достаточно подать в стратегию данные о начале и конце маршрута, чтобы получить массив точек маршрута в оговорённом формате. Вместо того, чтобы изначальный класс сам выполнял тот или иной алгоритм, он будет играть роль контекста, ссылаясь на одну из стратегий и делегируя ей выполнение работы. Чтобы сменить алгоритм, вам будет достаточно подставить в контекст другой объект-стратегию. Когда различные вариации алгоритмов реализованы в виде развесистого условного оператора. Каждая ветка такого оператора представляет собой вариацию алгоритма. В нашем примере каждый алгоритм поиска пути переедет в свой собственный класс.