Sobes.tech
Junior

V čom spočíva vzor 'Stratégia'?

sobes.tech AI

Odpoveď od AI

Šablóna "Stratégia" (Strategy) patrí medzi správanie vzorov návrhu a umožňuje definovať rodinu algoritmov, inkapsulovať každý z nich a spraviť ich vzájomne zameniteľnými. Umožňuje meniť algoritmus nezávisle od klientov, ktorí ho používajú.

Kľúčové body:

  • Kontext: Trieda, ktorá používa jeden z algoritmov. Obsahuje odkaz na rozhranie stratégie.
  • Rozhranie stratégie: Definuje spoločné rozhranie pre všetky konkrétne stratégie. Kontext s týmto rozhraním interaguje.
  • Konkrétne stratégie: Implementujú rozhranie stratégie a poskytujú konkrétnu implementáciu algoritmu.

Výhody:

  • Umožňuje ľahké pridávanie nových stratégií bez zmeny triedy kontextu.
  • Izoluje algoritmy do samostatných tried, čím robí kód prehľadnejším a udržiavateľnejším.
  • Umožňuje klientovi vybrať si implementáciu algoritmu počas behu.

Príklad použitia v iOS:

Napríklad, môžete použiť stratégiu na implementáciu rôznych spôsobov validácie vstupných údajov do textového poľa alebo na určenie rôznych algoritmov výpočtu zliav v aplikácii obchodu.

// Rozhranie stratégie
protocol ValidationStrategy {
    func isValid(_ input: String) -> Bool
}

// Konkrétna stratégia: Validácia E-mailu
struct EmailValidationStrategy: ValidationStrategy {
    func isValid(_ input: String) -> Bool {
        // Najjednoduchšia kontrola formátu emailu
        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)
    }
}

// Konkrétna stratégia: Validácia neprázdneho reťazca
struct NonEmptyValidationStrategy: ValidationStrategy {
    func isValid(_ input: String) -> Bool {
        return !input.isEmpty
    }
}

// Kontext
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)
    }
}

// Použitie
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