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.
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.
@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.