Die Idee von Strategy ist genau eine: Nimm das, was sich unterscheidet, und mach ein eigenes Objekt daraus. Jeder case-Zweig wird eine Klasse. Was alle Zweige gemeinsam haben — dass sie aus einer Bestellung einen Betrag machen — wird eine Schnittstelle.
public interface IVersandkosten
{
decimal Berechne(Bestellung bestellung);
}Beachte, dass jetzt die Bestellung hereingereicht wird, nicht mehr sechs lose Parameter. Jede Strategie nimmt sich daraus, was sie braucht, und ignoriert den Rest. Die Signatur wächst nicht mehr mit, wenn eine neue Strategie neue Angaben braucht.
Die Zweige von vorhin, jeder für sich:
public sealed class StandardVersand : IVersandkosten
{
public decimal Berechne(Bestellung b) =>
b.Warenwert > 100m ? 0m : 4.90m;
}
public sealed class ExpressVersand : IVersandkosten
{
public decimal Berechne(Bestellung b) =>
12.90m + (decimal)b.Gewicht * 0.5m;
}
public sealed class Abholung : IVersandkosten
{
public decimal Berechne(Bestellung b) => 0m;
}Und der Aufrufer — im Pattern heisst er Kontext — kennt nur noch die Schnittstelle:
public sealed class Kasse
{
private readonly IVersandkosten _versand;
public Kasse(IVersandkosten versand) => _versand = versand;
public decimal Gesamtbetrag(Bestellung bestellung) =>
bestellung.Warenwert + _versand.Berechne(bestellung);
}Der Kontext entscheidet nicht
Kasse enthält kein if und kein switch mehr über die Versandart. Sie bekommt die Strategie hereingereicht und ruft sie auf. Das ist der ganze Trick: Die Entscheidung wandert nach aussen, an genau eine Stelle, an der ohnehin schon zusammengebaut wird.
Eine neue Versandart hinzufügen
Mit switch
// Bestehende, getestete Methode öffnen
switch (art)
{
case "standard": ...
case "express": ...
case "abholung": ...
case "sperrgut": // neu
return 39.00m + ...; // neu
}Mit Strategy
// Neue Datei, nichts Bestehendes angefasst
public sealed class Sperrgut : IVersandkosten
{
public decimal Berechne(Bestellung b) =>
39.00m + (decimal)b.Gewicht * 1.2m;
}Links änderst du Code, der schon lief. Rechts fügst du Code hinzu. Das ist derselbe Aufwand in Zeilen — aber nicht dasselbe Risiko.
Was du dafür bezahlst
Aus einer Datei mit vier Fällen werden fünf Dateien. Die Rechenwege stehen nicht mehr untereinander, sondern nebeneinander im Projekt — du kannst sie nicht mehr in einem Blick vergleichen.
Das ist ein echter Verlust, und er ist der Grund, warum Strategy sich bei drei stabilen Fällen nicht lohnt. Es ist ein Tausch: Übersicht über alle Fälle gegen Unabhängigkeit jedes einzelnen Falls.
Kurz nachgedacht
Zählt nicht — nur zum Prüfen, ob es angekommen ist.
1.Warum bekommt Berechne die ganze Bestellung statt einzelner Parameter?