Sobes.tech
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