Junior
Na czym polega wzorzec 'Strategia'?
sobes.tech AI
Odpowiedź od AI
Wzorzec "Strategia" należy do wzorców behawioralnych i pozwala na zdefiniowanie rodziny algorytmów, ich enkapsulację i wymienność. Umożliwia zmianę algorytmu niezależnie od klientów, którzy z niego korzystają.
Kluczowe punkty:
- Kontekst: Klasa, która korzysta z jednego z algorytmów. Zawiera odwołanie do interfejsu strategii.
- Interfejs Strategii: Definiuje wspólny interfejs dla wszystkich konkretnych strategii. Kontekst wchodzi w interakcję z tym interfejsem.
- Konkretnie Strategie: Implementują interfejs strategii, dostarczając konkretną implementację algorytmu.
Zalety:
- Umożliwia łatwe dodawanie nowych strategii bez zmiany klasy kontekstowej.
- Izoluje algorytmy w osobnych klasach, czyniąc kod bardziej czytelnym i łatwiejszym w utrzymaniu.
- Umożliwia klientowi wybór implementacji algorytmu w czasie działania.
Przykład użycia w iOS:
Na przykład, można użyć strategii do implementacji różnych metod walidacji danych wejściowych w polu tekstowym lub do określenia różnych algorytmów obliczania rabatów w aplikacji sklepu.
// Interfejs strategii
protocol ValidationStrategy {
func isValid(_ input: String) -> Bool
}
// Konkretny strategia: Walidacja e-mail
struct EmailValidationStrategy: ValidationStrategy {
func isValid(_ input: String) -> Bool {
// Najprostsza weryfikacja formatu 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)
}
}
// Konkretny strategia: Walidacja niepustego ciągu
struct NonEmptyValidationStrategy: ValidationStrategy {
func isValid(_ input: String) -> Bool {
return !input.isEmpty
}
}
// Kontekst
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)
}
}
// Użycie
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