Skip to main content
Dat 2. semester Bornholm
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

Strategy Pattern

Strategy Pattern

Formål

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.


Hvornår giver Strategy mening?

  • Når du har flere måder at gøre det samme på
  • Når regler/algoritmer ofte ændrer sig
  • Når if/else vokser baseret på hvordan noget skal gøres

Problemet (uden Strategy)

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;
        }
    }
}

Problemer

  • Mange if/else
  • Svær at udvide
  • Bryder Open/Closed Principle

Løsningen: Strategy Pattern

1. Strategy-interface

public interface DiscountStrategy {
    double applyDiscount(double price);
}

2. Konkrete strategier

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;
    }
}

3. Context-klassen (bruger strategien)

public class PriceCalculator {

    private DiscountStrategy strategy;

    public PriceCalculator(DiscountStrategy strategy) {
        this.strategy = strategy;
    }

    public double calculate(double price) {
        return strategy.applyDiscount(price);
    }
}

4. Brug Strategy

PriceCalculator calculator =
        new PriceCalculator(new StudentDiscount());

double finalPrice = calculator.calculate(100);

Strategien kan nemt skiftes:

calculator = new PriceCalculator(new SeniorDiscount());

Hvad har vi opnået?

  • Ingen if/else
  • Ny rabat = ny klasse
  • Let at ændre adfærd ved runtime
  • Overholder Open/Closed Principle

Opgave

Design et Strategy Pattern til afsendelse af beskeder.

Givet

interface SendStrategy {
    void send(String message);
}

Krav

  • Lav mindst to strategier:

    • EmailStrategy
    • SmsStrategy
  • Lav en NotificationService, der bruger SendStrategy

  • Skift strategi uden at bruge if/else


Factory vs Strategy – Sammenligning

Factory PatternStrategy Pattern
Opretter objekterÆndrer adfærd
Fokuserer på hvilken klasseFokuserer på hvordan noget gøres
Bruges ofte ved startBruges ofte ved runtime
Skjuler newSkjuler algoritmer
Handler om objekt-oprettelseHandler om logik/algoritmer

Opsummering

Factory vælger objektet.
Strategy vælger adfærden.