EMZETT.
Login

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

In 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