Marvin Rabe

Strategy Design Pattern

Wir betrachten im folgenden Beitrag eine Schach Anwendung. Wir werden sehen, wie das Strategy Design Pattern angewendet werden kann, um gemeinsame Algorithmen wiederverwendbar auszulagern.

Algorithmen werden mehrfach verwendet

Gehen wir davon aus, dass für jede Spielfigur eine Klasse erstellt wurde. Die Methode bewegen() prüft, ob die Figur nach bestimmten Regeln bewegt werden kann. Wir haben folgendes Klassendiagramm:

Schachfiguren Klassen Diagramm

Wie wir sehen können, wird die Methode bewegen() von jeder Schachfigur implementiert.

Betrachten wir nun die Dame und den Läufer. Beide Figuren können sich diagonal bewegen. Man kann also davon ausgehen, dass beide den gleichen Algorithmus zur Überprüfung von diagonalen Bewegungen implementiert haben. Dieser Algorithmus ist somit also mindestens doppelt implementiert.

Man beachte auch, dass man bei diesem Diagramm nicht erkennen kann, wie sich die Figuren bewegen können. Das Verhalten der Klassen ist somit nicht ersichtlich.

Wie könnten wir diese Algorithmen am besten auslagern?

Strategy Design Pattern verwenden

Mit dem Strategy Design Pattern lassen sich solche Situationen vermeiden. Wir erstellen zusätzliche Klassen um gemeinsame Algorithmen auszulagern. Diese Klassen nennen wir Strategien. Der Kontext bekommt die jeweiligen Strategien vom Klienten (z. B. eine Factory) zugewiesen.

Allgemein sieht die Implementation des Design Patterns so aus:

Strategy Design Pattern Klassen Diagramm

Nun zurück zu unserem Beispiel. Wir könnten sämtliche Bewegungen in separate Strategien lagern. Dann bräuchten wir keine einzelnen Klassen für die Spielfiguren, sondern würden der allgemeinen Klasse Spielfigur die benötigten Strategien zuweisen. Die Spielfiguren werden vom Spielfeld erstellt werden. Sie würden sich dann durch ihr zugewiesenes Verhalten unterscheiden und nicht mehr durch die Implementierung.

Strategy Design Pattern Beispiel mit Schachfiguren

Ich habe vier Strategien definiert: Gerade überprüft ob der Spielzug vertikal oder horizontal erfolgt ist. Diagonal prüft diagonale Spielzüge. Für den Springer und Bauer habe ich eigene Strategien erstellt, da die Bewegungen dieser Figuren speziell sind. Es sollten in diesem Fall mehr als eine Strategie dem Kontext zugewiesen werden können, da die Dame und der König sowohl Diagonal as auch Gerade laufen kann.

Wir müssen die Algorithmen zur Überprüfung der Bewegung somit nur ein einziges Mal implementieren und können sie bei unterschiedlichen Figuren wiederverwenden. Ebenfalls können wir gut erkennen, welche Regeln es für die Bewegungen auf dem Spielfeld gibt.

Natürlich ist dieses Beispiel nicht vollständig. Mach dir doch in den Kommentaren Überlegungen wie man die fehlenden Details (Distanz der Bewegung, Kollisionen auf Spielfeld überprüfen, etc.) abbilden könnte.

Vor- und Nachteile

Das Strategy Design Pattern bietet einige Vorteile:

Doch gibt es einige Nachteile, die du kennen solltest:

Zusammenfassung

Sobald viele verschiedene Algorithmen implementiert werden, die zur selben Familie gehören, lohnt sich dieses Design Pattern. Die Auswahl des richtigen Algorithmus kann dann dynamisch durch den Klienten erfolgen. Dadurch kann das Verhalten des Kontextes flexibler gestalten werden.

Wie du sehen konntest, bietet dir das Strategy Pattern eine elegante Möglichkeit zur dynamischen Wiederverwendung von gleichartigen Algorithmen. Es lohnt sich nun alte Projekte durchzugehen und zu schauen, ob du Stellen entdecken kannst, die von diesem Design Pattern profitieren würden. Schreib uns deine Erfahrungen mit diesem Pattern in die Kommentare.