Sobes.tech
Junior

En quoi consiste le motif 'Stratégie' ?

sobes.tech IA

Réponse de l'IA

Le motif "Stratégie" appartient aux motifs comportementaux de conception et permet de définir une famille d'algorithmes, d'en encapsuler chacun et de les rendre interchangeables. Il permet de changer d'algorithme indépendamment des clients qui l'utilisent.

Points clés:

  • Contexte: La classe qui utilise l'un des algorithmes. Elle contient une référence à l'interface de stratégie.
  • Interface de Stratégie: Définit une interface commune pour toutes les stratégies concrètes. Le contexte interagit avec cette interface.
  • Stratégies Concrètes: Implémentent l'interface de stratégie, fournissant une implémentation concrète de l'algorithme.

Avantages:

  • Permet d'ajouter facilement de nouvelles stratégies sans modifier la classe de contexte.
  • Isoler les algorithmes dans des classes séparées, rendant le code plus lisible et maintenable.
  • Permet au client de choisir l'implémentation de l'algorithme au moment de l'exécution.

Exemple d'utilisation en iOS:

Par exemple, on peut utiliser la Stratégie pour implémenter différentes méthodes de validation de l'entrée de données dans un champ de texte ou pour définir différents algorithmes de calcul de remises dans une application de magasin.

// Interface de Stratégie
protocol ValidationStrategy {
    func isValid(_ input: String) -> Bool
}

// Stratégie Concrète: Validation E-mail
struct EmailValidationStrategy: ValidationStrategy {
    func isValid(_ input: String) -> Bool {
        // Vérification simple du format 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)
    }
}

// Stratégie Concrète: Validation de chaîne non vide
struct NonEmptyValidationStrategy: ValidationStrategy {
    func isValid(_ input: String) -> Bool {
        return !input.isEmpty
    }
}

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

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