Sobes.tech
Junior

У чему се састоји образац 'Стратегија'?

sobes.tech АИ

Одговор од АИ

Шаблонът "Стратегия" (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