Strategy Pattern

 

Strategy Pattern

Das Strategy Pattern ist ein Design Pattern, das zu den Behavioral Patterns gehört. Es ermöglicht die Definition einer Gruppe von Algorithmen, welche dann zur Laufzeit ausgetauscht werden können.

Aufbau

Das Strategy Pattern besteht aus drei Komponenten. Das Strategy Interface definiert die Funktionen, welche dann von den spezifischen Strategy Klassen implementiert werden. Die Implementationen nennt man "Concrete Strategies" Der Context führt das gewünschte Verhalten aus und kann die Strategy zur Laufzeit anpassen. 

Anwendungsbeispiel

In meinem Beispiel möchte ich einen Shop entwickeln, welcher mehrere Zahlungsmethoden anbietet. Für den Zahlungsvorgang habe ich die folgende Klasse erstellt:


Das Problem an dieser Lösung ist, dass der Code schwierig zu erweitern ist. Jedes mal, wenn eine neue Zahlungsmethode hinzukommt, muss ich im Switch-Case einen weiteren Fall mit der Logik für die neue Zahlungsmethode einbauen. Dabei ist das Ergebnis der verschiedenen Zahlungsmethoden immer das gleiche: Der Betrag wird überwiesen und die Bestellung aufgenommen. Ausserdem würde die Klasse immer weiter wachsen, was schnell unübersichtlich werden könnte.

Lösung

Hier kommt das Strategy Pattern ins Spiel. Statt einer riesigen Klasse, welche die Logik aller Zahlungsmethoden enthält, erstellen wir ein Interface, welches die Methode "Pay" definiert:


Nun können wir die Klassen für die konkreten Strategien implementieren. In meinem Beispiel möchte ich die Zahlungsmethoden Twint, Kreditkarte und PayPal:




Dadurch sind die Zahlungsmethoden gekapselt und der Code ist etwas übersichtlicher. Als nächstes braucht es noch den Context, welcher die Bezahlung über das IPaymentStrategy Interface ausführt. Dabei spielt es für ihn keine Rolle, welche konkrete Zahlungsmethode verwendet wird. In meinem Beispiel nenne ich den Context "PaymentService".


Ich verwende Dependency Injection und den ServiceProvider von Microsoft, um die verschiedenen Zahlungsmethoden zu registrieren und im Konstruktor des PaymentService mitzugeben. In der Methode "ProcessOrder()" kann der Benutzer eine Zahlungsmethode auswählen. Anschliessend wird diese verwendet, um die Zahlung auszuführen.
Der gesamte Code befindet sich in meinem GitHub Repository

Vorteile

Austauschbarkeit:
Durch die Verwendung von Strategies können Algorithmen flexibel ausgetauscht werden, ohne Änderungen in der Hauptklasse vorzunehmen.

Erweiterbarkeit:
Neue Strategien können einfach hinzugefügt werden, ohne den bestehenden Code zu ändern.

Testbarkeit:
Das Strategy Pattern erleichtert das Testen, da einzelne Strategien leicht isoliert getestet werden können.

Fazit

Das Strategy Pattern bietet eine effiziente Möglichkeit, unterschiedliche Verhaltensweisen in Software flexibel zu implementieren. Durch die klare Trennung von Algorithmen und Kontext wird der Code übersichtlicher, wartbarer und leichter erweiterbar. In dynamischen Umgebungen, in denen sich Anforderungen häufig ändern, ist dieses Design Pattern ein wertvolles Werkzeug für die Entwicklung anpassungsfähiger Software.

Kommentare

Beliebte Posts aus diesem Blog

AES in C#

QuestPDF

ASP.NET Core Identity