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