POO & Design Patterns

Le patron Strategy

Le patron Strategy

Le patron Strategy est un patron comportemental du GoF qui permet de faire varier l'algorithme (i.e. le code) utilisé dans une classe.

L'idée est d'utiliser un objet pour simplement fournir du code et de définir une interface commune à ces objets.

NDLR: c'est que vous faîtes à chaque fois qu'une classe ou une méthode prend en paramètre une lambda.

Par exemple, dans l'API Java, la méthode de tri List<T>.sort(Comparator<? super T>) prend en paramètre le code permettant de comparer deux éléments.

Diagramme UML

Exemple

class Credential{
    private final String login;
    private final String password;

    // getters and setters
}

class CredentialValidator {
    // ...
    
    private boolean isSecured(Crendential cred){
         if (!Pattern.compile("[a-z]+").matcher(cred.getLogin()).matches()){
             return false;
         }
         return cred.getPassword().length()>=8;
    }
}

On veut pouvoir faire évoluer la politique de validation des mots de passe.

Exemple

@FunctionalInterface
interface PasswordValidator {
    boolean isValid(String s)
}
class CredentialValidator {
    private PasswordValidator validator = s -> s.length()>=8;

    public void setPasswordValidator(PasswordValidator validator){
         this.validator = Objects.requireNonNull(validator);
    }     
    // ...
    private boolean isSecured(Crendential cred){
         if (!Pattern.compile("[a-z]+").matcher(cred.getLogin()).matches()){
             return false;
         }
         return validator.isValid(cred.getPassword());
    }
}

Moralement, l'interface PasswordValidator est identique à Predicate<String>. On lui donne un autre nom pour rendre le code plus lisible.