Sobes.tech
Junior

V čem spočívá vzor 'Strategie'?

sobes.tech AI

Odpověď od AI

Vzor "Strategie" patří mezi chování vzory návrhu a umožňuje definovat rodinu algoritmů, inkapsulovat každý z nich a udělat je zaměnitelnými. Umožňuje měnit algoritmus nezávisle na klientech, kteří jej používají.

Klíčové body:

  • Kontext: Třída, která používá jeden z algoritmů. Obsahuje odkaz na rozhraní strategie.
  • Rozhraní strategie: Definuje společné rozhraní pro všechny konkrétní strategie. Kontext s tímto rozhraním interaguje.
  • Konkrétní strategie: Implementují rozhraní strategie a poskytují konkrétní implementaci algoritmu.

Výhody:

  • Umožňuje snadno přidávat nové strategie bez změny třídy kontextu.
  • Izoluje algoritmy v samostatných třídách, což činí kód přehlednější a lépe udržovatelný.
  • Umožňuje klientovi vybírat implementaci algoritmu v době běhu.

Příklad použití v iOS:

Například lze použít strategii k implementaci různých způsobů validace vstupu do textového pole nebo k určení různých algoritmů výpočtu slev v obchodní aplikaci.

// Rozhraní strategie
protocol ValidationStrategy {
    func isValid(_ input: String) -> Bool
}

// Konkrétní strategie: Validace e-mailu
struct EmailValidationStrategy: ValidationStrategy {
    func isValid(_ input: String) -> Bool {
        // Nejjednodušší 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étní strategie: Validace ne-prázdného řetězce
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žití
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