Strategy Pattern
- Eliminate conditional statement
- Behavior encapsulated in class
- Difficult to add new strategy
- Client aware of strategy
- Client choose strategy
Main
public static void main(String[] args) {
CreditCard amex = new CreditCard(new AmexStrategy());
amex.setNumber("379185883464283");
amex.setDate("04/2020");
amex.setCvv("123");
System.out.println("Amex valid? : " + amex.isValid());
}
Credit Card
public class CreditCard {
// getters & setters
}
private String number;
private String date;
private String cvv;
private ValidationStrategy vs;
public CreditCard(ValidationStrategy vs){
this.vs = vs;
}
public boolean isValid(){
return vs.isValid(this);
}
ValidationStrategy
public abstract class ValidationStrategy {
public abstract boolean isValid(CreditCard c);
protected boolean passesLuhn(String ccNumber) {
boolean alternate = false;
int sum = 0;
for (int i = ccNumber.length() - 1; i >= 0; i--) {
int n = Integer.parseInt(ccNumber.substring(i, i + 1));
if (alternate) {
n *= 2;
if (n > 9) {
n = (n % 10) + 1;
}
}
sum += n;
alternate = !alternate;
}
return (sum % 10 == 0);
}
}
Specific Strategy
public class AmexStrategy extends ValidationStrategy {
@Override
public boolean isValid(CreditCard c) {
boolean isValid = true;
isValid = c.getNumber().startsWith("37") || c.getNumber().startsWith("34");
isValid = passesLuhn(c.getNumber());
return isValid;
}
}
Comentarios
Publicar un comentario