← Назад к вопросам

Что такое паттерн Стратегия (Strategy)?

2.0 Middle🔥 141 комментариев
#Архитектура и паттерны

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Паттерн Стратегия (Strategy)

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

Основная идея

Вместо того чтобы реализовывать одно поведение напрямую в классе, мы выносим его в отдельные классы-стратегии. Класс контекста (например, ViewController или какая-либо модель) содержит ссылку на интерфейс стратегии и делегирует выполнение операции конкретной стратегии. Это соответствует принципу инкапсуляции изменяющегося поведения и принципу Open/Closed из SOLID.

Структура паттерна

  1. Протокол/Интерфейс стратегии — определяет общий метод для всех конкретных стратегий.
  2. Конкретные стратегии — реализуют протокол, предоставляя свои версии алгоритма.
  3. Контекст — хранит ссылку на стратегию и вызывает её метод.

Пример на Swift

Допустим, у нас есть приложение для обработки платежей с разными способами оплаты.

// 1. Протокол стратегии
protocol PaymentStrategy {
    func pay(amount: Double) -> String
}

// 2. Конкретные стратегии
class CreditCardPayment: PaymentStrategy {
    func pay(amount: Double) -> String {
        return "Оплата \(amount) руб. кредитной картой"
    }
}

class PayPalPayment: PaymentStrategy {
    func pay(amount: Double) -> String {
        return "Оплата \(amount) руб. через PayPal"
    }
}

class ApplePayPayment: PaymentStrategy {
    func pay(amount: Double) -> String {
        return "Оплата \(amount) руб. через Apple Pay"
    }
}

// 3. Контекст
class PaymentProcessor {
    private var strategy: PaymentStrategy

    init(strategy: PaymentStrategy) {
        self.strategy = strategy
    }

    func setStrategy(_ strategy: PaymentStrategy) {
        self.strategy = strategy
    }

    func executePayment(amount: Double) -> String {
        return strategy.pay(amount: amount)
    }
}

// Использование
let processor = PaymentProcessor(strategy: CreditCardPayment())
print(processor.executePayment(amount: 1000)) // "Оплата 1000.0 руб. кредитной картой"

processor.setStrategy(ApplePayPayment())
print(processor.executePayment(amount: 500))  // "Оплата 500.0 руб. через Apple Pay"

Преимущества паттерна Стратегия в iOS

  • Устранение условных операторов: Вместо switch или if-else для выбора алгоритма мы используем полиморфизм.
  • Соблюдение принципа единственной ответственности: Алгоритмы отделены от контекста, что упрощает тестирование и поддержку.
  • Гибкость и расширяемость: Новые стратегии можно добавлять без изменения существующего кода контекста.
  • Упрощение юнит-тестирования: Каждую стратегию можно тестировать изолированно.

Типичные сценарии использования в iOS

  • Обработка данных: Например, разные алгоритмы сортировки или валидации в зависимости от контекста.
  • Анимации и переходы: Выбор различных анимационных стратегий для UIView-переходов.
  • Сетевые запросы: Различные стратегии кэширования или обработки ошибок.
  • Форматирование текста: Разные стратегии для отображения дат, чисел или валют.

Важные нюансы

  • Паттерн может привести к увеличению числа классов в проекте, но это оправдано за счёт чёткого разделения ответственности.
  • В Swift часто используется вместе с enum, но стратегия предпочтительнее, когда поведение требует сложной логики или внешних зависимостей.
  • Отличие от паттерна Декоратор: Стратегия меняет алгоритм целиком, а Декоратор добавляет новую функциональность, оборачивая объект.

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

Что такое паттерн Стратегия (Strategy)? | PrepBro