Strategy-Muster (Strategie)
Kurz: Das Strategy-Muster kapselt austauschbare Algorithmen hinter einer gemeinsamen Schnittstelle, sodass das Verhalten eines Objekts zur Laufzeit gewechselt werden kann.
Genauer: Statt langer if/else- oder switch-Ketten bekommt ein Objekt eine „Strategie“ übergeben, die die eigentliche Arbeit erledigt – etwa verschiedene Sortier-, Preis- oder Versandkostenberechnungen. Neue Strategien kommen hinzu, ohne bestehenden Code zu ändern (Open/Closed-Prinzip, siehe SOLID).
Im Detail
def kein_rabatt(preis): return preis
def studenten_rabatt(preis): return preis * 0.8
def black_friday(preis): return preis * 0.5
class Warenkorb:
def __init__(self, rabatt=kein_rabatt):
self.rabatt = rabatt
self.summe = 0
def kaufe(self, preis):
self.summe += self.rabatt(preis)
k = Warenkorb(studenten_rabatt)
k.kaufe(100)
k.kaufe(50)
print(k.summe) # 120.0In Sprachen mit Funktionen als Werte genügt eine Funktion als Strategie; in klassischer OOP definiert man eine Schnittstelle mit mehreren Implementierungen:
interface Sortierung { void sortiere(int[] daten); }
class Schnell implements Sortierung { public void sortiere(int[] d) { /* Quicksort */ } }
class Stabil implements Sortierung { public void sortiere(int[] d) { /* Mergesort */ } }
class Auswertung {
private final Sortierung strategie;
Auswertung(Sortierung s) { this.strategie = s; }
void lauf(int[] daten) { strategie.sortiere(daten); }
}Beispiele aus Standardbibliotheken: ein Comparator für Sortierungen, Authentifizierungs-Strategien in Passport.js, Kompressionsverfahren in einer Archivbibliothek. Das Muster ähnelt dem State-Muster, bei dem das Objekt selbst die Strategie wechselt.
Siehe auch: SOLID, Polymorphie, Factory-Muster, Observer-Muster