Wie können Sie das Strategy Design Pattern lernen? Mache einen Hamburger!

Wissen Sie, wie man einen Burger bestellt?

Dann habe ich gute Nachrichten für Sie. Dann wissen Sie, wie Sie eines der am häufigsten verwendeten Entwurfsmuster, das Strategiemuster, verwenden!

"Wie so?", Könnten Sie fragen. Werfen wir einen Blick auf die Merkmale des Strategiemusters.

  • Es definiert eine Familie von Algorithmen.
  • Es kapselt jeden Algorithmus.
  • Es macht die Algorithmen innerhalb dieser Familie austauschbar.

Das Strategiemuster lässt den Algorithmus unabhängig von den Clients variieren, die ihn verwenden.

Fühlst du dich so verwirrt wie dieser Typ?

Wie hat das etwas mit Burgern zu tun?

Denken wir eine Sekunde über Burger nach.

Es gibt viele Arten von Burgern: Gemüseburger, Cheeseburger, gegrillter Hühnerburger und Doppel-Cheeseburger, um nur einige zu nennen. Alle haben dasselbe Format: das obere Brötchen + das Pastetchen + das untere Brötchen.

Es ist die Pastete, die jeden Burger anders macht. Ein Cheeseburger hat Käse und eine Rindfleischpastete in der Mitte, während ein gegrillter Hühnerburger eine gegrillte Hühnerbrustpastete hat.

Lassen Sie uns die Definition des Strategiemusters in Bezug auf Burger wiederholen. Was ist die Familie der Algorithmen in Bezug auf Burger? Es ist die Familie der verschiedenen Pastetchen:

  • Pastetchen für einen Hühnerburger = [gegrillte Hühnerbrust]
  • Pastetchen für einen Cheeseburger = [Käse + Rindfleisch Pastetchen]
  • Pastetchen für einen doppelten Cheeseburger = [Käse + Rindfleisch Pastetchen + Käse + Rindfleisch Pastetchen]

Sie sind gekapselt und untereinander austauschbar. Tauschen Sie das Chicken Burger Patty mit dem Cheeseburger Patty aus und Sie erhalten einen Cheeseburger.

Mit der Strategie kann der Algorithmus unabhängig von den Clients variieren, die ihn verwenden.

Sie können jeden Burger bestellen, den Sie mögen. Für einen Koch gilt jedoch die gleiche allgemeine Vorgehensweise, um einen Burger zuzubereiten: Bereiten Sie das Brötchen vor, kochen Sie das Brötchen und legen Sie das Brötchen zwischen das obere und untere Brötchen.

Ein Burger ist ein echtes Beispiel für die Verwendung von Strategiemustern.

Werfen wir einen Blick auf den Code.

Das Strategiemuster besteht aus drei Teilnehmern.

Strategy deklariert eine gemeinsame Schnittstelle für alle unterstützten Algorithmen. Context verwendet diese Schnittstelle, um den durch eine konkrete Strategie definierten Algorithmus aufzurufen.

Konkrete Strategie implementiert den Algorithmus über das StrategyInterface.

Der Kontext wird mit einem ConcreteStrategy-Objekt konfiguriert. pflegt einen Verweis auf ein Strategieobjekt; kann eine Schnittstelle definieren, über die die Strategie auf ihre Daten zugreifen kann.

GrilledChickenStuffing und BeefPattyStuffing sind unsere konkreten Strategien. Jeder definiert, wie seine Füllung gekocht werden soll. Die Burger-Klasse ist unser Kontext. Es wurde mit einer konkreten Strategie konfiguriert und verwendet die konkrete Strategie später, wenn ein Burger gekocht werden muss.

In unserem Burger-Beispiel gibt es keine spezifische Klasse, die angibt, welche Schnittstelle die konkreten Strategien implementieren sollen. Das liegt daran, dass wir das dank Rubys Entenschreiben nicht müssen. Wenn es wie eine Ente geht und wie eine Ente spricht, ist es eine Ente. Wenn es als Burgerpastetchen gekocht werden kann, ist es ein Burgerpastetchen.

Strategy gibt an, für welche Schnittstelle eine konkrete Strategie implementiert werden soll und für welchen Kontext sie verwendet werden kann. Wie Sie im obigen Code sehen können, implementieren sowohl GrilledChickenStuffing als auch BeefPattyStuffing die Cook-Methode, und diese Methode erwartet der Benutzer einer konkreten Strategie, auch als Kontext bezeichnet, dass eine konkrete Strategie bereitgestellt wird.

Die Schlüsselidee des Strategiemusters

Der Schlüssel zum Strategiemuster besteht darin, die unterschiedlichen Algorithmen in ein separates Objekt zu ziehen. Diese Objekte werden zu einer Familie von Algorithmen, aus denen der Kontext auswählen kann. Jedes dieser Objekte, auch bekannt als die Strategien, erledigt den gleichen Job und unterstützt die gleiche Schnittstelle.

In unserem Burger-Beispiel haben wir verschiedene Pastetchenstrategien für einen Burger. Und jede der konkreten Burger-Pastetchen-Strategien unterstützt dieselbe Schnittstelle, indem sie die Kochmethode implementiert.

Es geht nur um Komposition. Der Benutzer hat eine Strategie und delegiert. Der Benutzer der Strategie delegiert den Job. In unserem Beispiel hat ein Burger eine Pastete und delegiert die Aufgabe des Kochens.

Vorteile des Strategiemusters

  • Es erreicht eine bessere Trennung der Bedenken, indem eine Reihe von Strategien aus einer Klasse herausgezogen werden, und die Burger-Klasse wird erneut von jeglicher Verantwortung für unser Wissen über die Füllung entlastet.
  • Das Wechseln von Strategien zur Laufzeit ist einfach, da das Muster auf Komposition und Delegation und nicht auf Vererbung basiert.

Dinge, auf die Sie bei der Verwendung des Strategiemusters achten sollten

  • Datenübergabe zwischen Kontext und Strategie. Wenn die Implementierung einer konkreten Strategie Daten aus dem Kontext erfordert, können Sie die Daten entweder als Parameter an eine konkrete Strategie übergeben oder den Kontext selbst an eine konkrete Strategie übergeben. Auf diese Weise kann die konkrete Strategie über den Kontext auf die Daten zugreifen. Achten Sie auf die Verwicklung des Kontexts und der konkreten Strategie.
  • Überprüfen Sie, ob Sie das Strategiemuster, die Vorlagenmethode oder das Dekorationsmuster tatsächlich benötigen.

Gestaltungsprinzipien, die im Strategiemuster verwendet werden

  • Fassen Sie zusammen, was variiert
  • Bevorzugen Sie die Komposition gegenüber der Vererbung
  • Programm an Schnittstellen, nicht Implementierung

Jetzt haben Sie das Strategiemuster kennengelernt.

Hier ist eine wichtige Frage: Was ist Ihre Lieblings-Burger-Strategie? :)

Ich veröffentliche wöchentlich auf sihui.io.

Abonnieren Sie, damit Sie den nächsten Artikel aus der Serie nicht verpassen.

Das nächste Mal werfen wir einen Blick auf die Template-Methode und…