> For the complete documentation index, see [llms.txt](https://y2kot.gitbook.io/untitled/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://y2kot.gitbook.io/untitled/patterns/behavioral-patterns/strategy.md).

# Стратегия

## Назначение

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

{% hint style="info" %}
Примером такого алгоритма может быть алгоритм обработки заказов в интернет-магазине. В зависимости от способа доставки заказа (курьерская доставка, почта, самовывоз), нужно применить разные варианты расчета стоимости доставки.
{% endhint %}

## Решаемые задачи

* Разделение алгоритма на отдельные классы

Паттерн позволяет выделить различные варианты реализации алгоритма в отдельные классы, что упрощает структуру кода и делает его более модульным.

* Подмена алгоритма во время выполнения программы

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

* Изменение поведения объекта

Паттерн позволяет изменять поведение объекта без изменения самого объекта или его наследников.

## UML диаграмма

<div data-full-width="true"><figure><img src="/files/294KuLHDPiVBbg7hKXZ1" alt=""><figcaption><p>UML диаграмма паттерна "Стратегия"</p></figcaption></figure></div>

## Преимущества

1. Инкапсуляция реализации различных алгоритмов.
2. Вызов всех алгоритмов одним стандартным образом. Все конкретные стратегии реализуют общий интерфейс. Это позволяет вызывать все алгоритмы одним стандартным образом, независимо от конкретной стратегии.
3. Возможность подмены алгоритмов во время выполнения.

## Недостатки

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

## Взаимодействие с другими паттернами

* Паттерн [Фабричный метод](/untitled/patterns/creationals-patterns/factory-method.md)может использоваться для создания объектов стратегий.
* Паттерн [Декоратор](/untitled/patterns/structural-patterns/dekorator.md) может использоваться для добавления дополнительного поведения или функциональности к конкретным стратегиям. Декоратор позволяет обернуть стратегию в другой объект и добавить ему дополнительные возможности, не изменяя саму стратегию.
* Паттерн [Команда](/untitled/patterns/behavioral-patterns/command.md) может использоваться для инкапсуляции вызова стратегии в отдельный объект команды. Команда может содержать ссылку на объект стратегии и вызывать его методы при выполнении команды. Это позволяет легко переключаться между разными стратегиями, используя различные команды.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://y2kot.gitbook.io/untitled/patterns/behavioral-patterns/strategy.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
