Strategy Pattern
Strategy Pattern bruges til at kunne skifte adfærd (algoritme/forretningsregel) ved runtime uden at ændre den klasse, der bruger adfærden.
I stedet for if/else eller switch flyttes variationen ud i udskiftelige strategier, som alle implementerer samme interface.
- Når du har flere måder at gøre det samme på
- Når regler/algoritmer ofte ændrer sig
- Når
if/elsevokser baseret på hvordan noget skal gøres
class PriceCalculator {
public double calculate(double price, String customerType) {
if (customerType.equals("student")) {
return price * 0.9;
} else if (customerType.equals("senior")) {
return price * 0.8;
} else {
return price;
}
}
}
- Mange
if/else - Svær at udvide
- Bryder Open/Closed Principle
public interface DiscountStrategy {
double applyDiscount(double price);
}
public class StudentDiscount implements DiscountStrategy {
public double applyDiscount(double price) {
return price * 0.9;
}
}
public class SeniorDiscount implements DiscountStrategy {
public double applyDiscount(double price) {
return price * 0.8;
}
}
public class NoDiscount implements DiscountStrategy {
public double applyDiscount(double price) {
return price;
}
}
public class PriceCalculator {
private DiscountStrategy strategy;
public PriceCalculator(DiscountStrategy strategy) {
this.strategy = strategy;
}
public double calculate(double price) {
return strategy.applyDiscount(price);
}
}
PriceCalculator calculator =
new PriceCalculator(new StudentDiscount());
double finalPrice = calculator.calculate(100);
Strategien kan nemt skiftes:
calculator = new PriceCalculator(new SeniorDiscount());
- Ingen
if/else - Ny rabat = ny klasse
- Let at ændre adfærd ved runtime
- Overholder Open/Closed Principle
Design et Strategy Pattern til afsendelse af beskeder.
interface SendStrategy {
void send(String message);
}
Lav mindst to strategier:
EmailStrategySmsStrategy
Lav en
NotificationService, der brugerSendStrategySkift strategi uden at bruge
if/else
| Factory Pattern | Strategy Pattern |
|---|---|
| Opretter objekter | Ændrer adfærd |
| Fokuserer på hvilken klasse | Fokuserer på hvordan noget gøres |
| Bruges ofte ved start | Bruges ofte ved runtime |
Skjuler new | Skjuler algoritmer |
| Handler om objekt-oprettelse | Handler om logik/algoritmer |
Factory vælger objektet.
Strategy vælger adfærden.