Sobes.tech
Junior

In cosa consiste il pattern 'Strategia'?

sobes.tech AI

Risposta dell'AI

Il pattern "Strategia" appartiene ai pattern comportamentali di progettazione e consente di definire una famiglia di algoritmi, incapsularli ciascuno e renderli intercambiabili. Permette di cambiare l'algoritmo indipendentemente dai clienti che lo utilizzano.

Punti chiave:

  • Contesto: La classe che utilizza uno degli algoritmi. Contiene un riferimento all'interfaccia di strategia.
  • Interfaccia di Strategia: Definisce un'interfaccia comune per tutte le strategie concrete. Il contesto interagisce con questa interfaccia.
  • Strategie Concrette: Implementano l'interfaccia di strategia, fornendo un'implementazione concreta dell'algoritmo.

Vantaggi:

  • Permette di aggiungere facilmente nuove strategie senza modificare la classe di contesto.
  • Isola gli algoritmi in classi separate, rendendo il codice più leggibile e manutenibile.
  • Permette al cliente di scegliere l'implementazione dell'algoritmo in fase di esecuzione.

Esempio di utilizzo in iOS:

Ad esempio, si può usare la Strategia per implementare diversi metodi di validazione dell'input nei campi di testo o per definire diversi algoritmi di calcolo degli sconti in un'app di negozio.

// Interfaccia di Strategia
protocol ValidationStrategy {
    func isValid(_ input: String) -> Bool
}

// Strategia Concreta: Validazione E-mail
struct EmailValidationStrategy: ValidationStrategy {
    func isValid(_ input: String) -> Bool {
        // Verifica più semplice del formato 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)
    }
}

// Strategia Concreta: Validazione stringa non vuota
struct NonEmptyValidationStrategy: ValidationStrategy {
    func isValid(_ input: String) -> Bool {
        return !input.isEmpty
    }
}

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

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