Назад к вопросам
Junior
73
questionbank

В чем заключается паттерн 'Стратегия'?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Паттерн "Стратегия" (Strategy) относится к поведенческим паттернам проектирования и позволяет определить семейство алгоритмов, инкапсулировать каждый из них и сделать их взаимозаменяемыми. Он позволяет менять алгоритм независимо от клиентов, которые им пользуются.

Ключевые моменты:

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

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

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

Пример использования в iOS:

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

// Интерфейс Стратегии
protocol ValidationStrategy {
    func isValid(_ input: String) -> Bool
}

// Конкретная Стратегия: Валидация E-mail
struct EmailValidationStrategy: ValidationStrategy {
    func isValid(_ input: String) -> Bool {
        // Простейшая проверка формата email
        let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}"
        let emailPredicate = NSPredicate(format:"SELF MATCHES %@", emailRegex)
        return emailPredicate.evaluate(with: input)
    }
}

// Конкретная Стратегия: Валидация непустой строки
struct NonEmptyValidationStrategy: ValidationStrategy {
    func isValid(_ input: String) -> Bool {
        return !input.isEmpty
    }
}

// Контекст
class Validator {
    private var strategy: ValidationStrategy

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

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

    func validate(_ input: String) -> Bool {
        return strategy.isValid(input)
    }
}

// Использование
let emailValidator = Validator(strategy: EmailValidationStrategy())
print(emailValidator.validate("test@example.com")) // true
print(emailValidator.validate("invalid-email")) // false

let nonEmptyValidator = Validator(strategy: NonEmptyValidationStrategy())
print(nonEmptyValidator.validate("Hello")) // true
print(nonEmptyValidator.validate("")) // false