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