Sobes.tech
Junior

În ce constă pattern-ul 'Strategie'?

sobes.tech AI

Răspuns de la AI

Modelul "Strategie" aparține modelelor comportamentale de proiectare și permite definirea unei familii de algoritmi, încapsularea fiecăruia dintre ei și făcându-i interschimbabili. Permite schimbarea algoritmului independent de clienții care îl utilizează.

Puncte cheie:

  • Context: Clasa care utilizează unul dintre algoritmi. Conține o referință la interfața strategiei.
  • Interfața Strategiei: Definește o interfață comună pentru toate strategiile concrete. Contextul interacționează cu această interfață.
  • Strategii Concrete: Implementază interfața strategiei, oferind o implementare concretă a algoritmului.

Avantaje:

  • Permite adăugarea ușoară a unor noi strategii fără a modifica clasa de context.
  • Izolează algoritmii în clase separate, făcând codul mai ușor de citit și întreținut.
  • Permite clientului să aleagă implementarea algoritmului în timpul execuției.

Exemplu de utilizare în iOS:

De exemplu, se poate folosi Strategia pentru a implementa diferite moduri de validare a datelor de intrare într-un câmp de text sau pentru a defini diferite algoritmi de calcul al reducerilor într-o aplicație de magazin.

// Interfața Strategiei
protocol ValidationStrategy {
    func isValid(_ input: String) -> Bool
}

// Strategie Concretă: Validare E-mail
struct EmailValidationStrategy: ValidationStrategy {
    func isValid(_ input: String) -> Bool {
        // Verificare simplă a formatului 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)
    }
}

// Strategie Concretă: Validare șir non-vid
struct NonEmptyValidationStrategy: ValidationStrategy {
    func isValid(_ input: String) -> Bool {
        return !input.isEmpty
    }
}

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

// Utilizare
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