Was ist der Unterschied zwischen dem Strategieentwurfsmuster und dem Zustandsentwurfsmuster?

219

Was sind die Unterschiede zwischen dem Strategie-Entwurfsmuster und dem staatlichen Entwurfsmuster? Ich habe einige Artikel im Internet durchgesehen, konnte aber den Unterschied nicht klar erkennen.

Kann jemand bitte den Unterschied in Laienbegriffen erklären?

Chin Tser
quelle
Basierend auf den Antworten hier und meinen eigenen Beobachtungen scheint es, dass die Implementierungen weitgehend (wenn auch nicht vollständig) gleich sind. Der Unterschied besteht hauptsächlich in der Absicht: Wir versuchen, das Verhalten anzupassen, entweder basierend auf unserem Zustand (Zustandsmuster) oder basierend auf etwas anderem (Strategiemuster). Sehr oft ist etwas anderes "das, was der Kunde wählt", durch Injektion.
Timo

Antworten:

139

Ehrlich gesagt sind die beiden Muster in der Praxis ziemlich ähnlich, und der entscheidende Unterschied zwischen ihnen variiert in der Regel je nachdem, wen Sie fragen. Einige beliebte Optionen sind:

  • Zustände speichern einen Verweis auf das Kontextobjekt, das sie enthält. Strategien nicht.
  • Zustände dürfen sich selbst ersetzen (IE: um den Zustand des Kontextobjekts in etwas anderes zu ändern), Strategien hingegen nicht.
  • Strategien werden als Parameter an das Kontextobjekt übergeben, während Zustände vom Kontextobjekt selbst erstellt werden.
  • Strategien behandeln nur eine einzige spezifische Aufgabe, während Staaten die zugrunde liegende Implementierung für alles (oder fast alles) bereitstellen, was das Kontextobjekt tut.

Eine "klassische" Implementierung würde entweder Status oder Strategie für jedes Element auf der Liste entsprechen, aber Sie stoßen auf Hybride, die eine Mischung aus beiden aufweisen. Ob eine bestimmte eher staatlich oder strategisch ist, ist letztendlich eine subjektive Frage.


quelle
6
Wenn Sie die GoF als eine der beliebtesten Optionen betrachten, stimmen sie nicht darin überein, dass Zustände notwendigerweise durch den Kontext erstellt werden (können vom Client erstellt und wie bei der Strategie an den Kontext übergeben werden).
Will Hardwick-Smith
109
  • Beim Strategiemuster geht es wirklich darum, eine andere Implementierung zu haben, die (im Grunde) dasselbe erreicht, sodass eine Implementierung die andere ersetzen kann, wie es die Strategie erfordert. Beispielsweise könnten Sie in einem Strategiemuster unterschiedliche Sortieralgorithmen haben. Die Aufrufer des Objekts ändern sich nicht basierend auf der verwendeten Strategie, aber unabhängig von der Strategie ist das Ziel dasselbe (sortieren Sie die Sammlung).
  • Beim Zustandsmuster geht es darum, je nach Zustand verschiedene Dinge zu tun, während der Anrufer von der Last befreit wird, jeden möglichen Zustand zu berücksichtigen. So haben Sie möglicherweise eine getStatus()Methode, die je nach Status des Objekts unterschiedliche Status zurückgibt, aber der Aufrufer der Methode muss nicht unterschiedlich codiert sein, um jeden potenziellen Status zu berücksichtigen.
Yishai
quelle
1
aber wer ändert die strategie im strategiemuster?
Noor
1
@Noor, normalerweise ist es ein Parameter oder ein Feld. Der Code des tatsächlichen Anrufers wird nicht aufgrund einer Änderung der Strategie geändert.
Yishai
4
@Noor, ja, aber in jedem Strategiemuster, das ich mir gerade vorstellen kann, wird es eine Vorentscheidung sein, die sich in der Mitte nicht ändern wird.
Yishai
2
Ich habe das gleiche Problem, Status oder Strategie. Ich denke, der Unterschied in wenigen Worten ist: Status, Verhalten wird automatisch bestimmt, Strategie, Verhalten wird vom Anrufer bestimmt.
Rene MF
1
Wenn in der E-Commerce-Anwendung während der Weihnachtszeit ein zusätzlicher Rabatt gewährt werden muss, handelt es sich um ein staatliches Entwurfsmuster. Die tatsächliche Abzinsungslogik kann mit dem Strategieentwurfsmuster angewendet werden, wenn es mehr als einen Weg gibt, um zu dieser Zahl zu gelangen.
Bharathkumar V
85

Der Unterschied liegt einfach darin, dass sie verschiedene Probleme lösen:

  • Das Zustandsmuster befasst sich mit dem (Zustand oder Typ) eines Objekts (in) - es kapselt zustandsabhängiges Verhalten, während
  • Das Strategiemuster behandelt, wie ein Objekt eine bestimmte Aufgabe ausführt - es kapselt einen Algorithmus.

Die Konstrukte zur Erreichung dieser unterschiedlichen Ziele sind jedoch sehr ähnlich; Beide Muster sind Beispiele für Kompositionen mit Delegation.


Einige Beobachtungen zu ihren Vorteilen:

Durch die Verwendung des Staates wird Muster der Zustandshalte (Kontext) Klasse aus der Kenntnis erleichtert , was Staat oder geben es ist und was besagt , oder Arten , die verfügbar sind. Dies bedeutet, dass die Klasse dem Open-Closed-Design-Prinzip (OCP) folgt: Die Klasse ist geschlossen, um zu ändern, welche Zustände / Typen vorhanden sind, aber die Zustände / Typen sind für Erweiterungen offen.

Durch die Verwendung des Strategie - Musters des Algorithmus betriebene (Kontext) Klasse aus der Kenntnis erleichtert wird , wie eine bestimmte Aufgabe auszuführen (- der „Algorithmus“). Dieser Fall schafft auch eine Einhaltung der OCP; Die Klasse ist wegen Änderungen bezüglich der Ausführung dieser Aufgabe geschlossen, aber das Design ist sehr offen für Ergänzungen anderer Algorithmen zur Lösung dieser Aufgabe.
Dies verbessert wahrscheinlich auch die Einhaltung des Single-Responsibility-Prinzips (SRP) durch die Kontextklasse. Ferner wird der Algorithmus leicht für die Wiederverwendung durch andere Klassen verfügbar.

Ulf Åkerstedt
quelle
42

Kann jemand bitte in Laienbegriffen erklären?

Designmuster sind keine wirklichen "Laien" -Konzepte, aber ich werde versuchen, es so klar wie möglich zu machen. Jedes Entwurfsmuster kann in drei Dimensionen betrachtet werden:

  1. Das Problem, das das Muster löst;
  2. Die statische Struktur des Musters (Klassendiagramm);
  3. Die Dynamik des Musters (Sequenzdiagramme).

Vergleichen wir Zustand und Strategie.

Problem, das das Muster löst

Der Status wird in einem von zwei Fällen verwendet [GoF-Buch S. 306] :

  • Das Verhalten eines Objekts hängt von seinem Status ab und es muss sein Verhalten zur Laufzeit abhängig von diesem Status ändern.
  • Operationen haben große, mehrteilige bedingte Anweisungen, die vom Status des Objekts abhängen. Dieser Zustand wird normalerweise durch eine oder mehrere aufgezählte Konstanten dargestellt. Oft enthalten mehrere Operationen dieselbe bedingte Struktur. Das Zustandsmuster ordnet jeden Zweig der Bedingung einer separaten Klasse zu. Auf diese Weise können Sie den Status des Objekts als eigenständiges Objekt behandeln, das unabhängig von anderen Objekten variieren kann.

Wenn Sie sicherstellen möchten, dass Sie tatsächlich das Problem haben, das das Zustandsmuster löst, sollten Sie in der Lage sein, die Zustände des Objekts mithilfe einer endlichen Zustandsmaschine zu modellieren . Ein angewandtes Beispiel finden Sie hier .

Jeder Zustandsübergang ist eine Methode in der Zustandsschnittstelle. Dies bedeutet, dass Sie für ein Design über Zustandsübergänge ziemlich sicher sein müssen, bevor Sie dieses Muster anwenden. Andernfalls müssen beim Hinzufügen oder Entfernen von Übergängen die Schnittstelle und alle Klassen, die sie implementieren, geändert werden.

Ich persönlich fand dieses Muster nicht so nützlich. Sie können Finite-State-Maschinen jederzeit mithilfe einer Nachschlagetabelle implementieren (dies ist keine OO-Methode, funktioniert aber recht gut).

Die Strategie wird für Folgendes verwendet [GoF-Buch S. 316] :

  • Viele verwandte Klassen unterscheiden sich nur in ihrem Verhalten. Strategien bieten eine Möglichkeit, eine Klasse mit einem von vielen Verhaltensweisen zu konfigurieren.
  • Sie benötigen verschiedene Varianten eines Algorithmus. Beispielsweise können Sie Algorithmen definieren, die unterschiedliche räumliche / zeitliche Kompromisse widerspiegeln. Strategien können verwendet werden, wenn diese Varianten als Klassenhierarchie von Algorithmen implementiert sind [HO87].
  • Ein Algorithmus verwendet Daten, über die Clients nichts wissen sollten. Verwenden Sie das Strategiemuster, um zu vermeiden, dass komplexe, algorithmische Datenstrukturen verfügbar gemacht werden.
  • Eine Klasse definiert viele Verhaltensweisen, und diese werden in ihren Operationen als mehrere bedingte Anweisungen angezeigt. Verschieben Sie verwandte bedingte Zweige anstelle vieler Bedingungen in ihre eigene Strategieklasse.

Der letzte Fall, in dem die Strategie angewendet werden soll, bezieht sich auf ein Refactoring, das als Ersetzen bedingt durch Polymorphismus bezeichnet wird .

Zusammenfassung: Staat und Strategie lösen sehr unterschiedliche Probleme. Wenn Ihr Problem nicht mit einer endlichen Zustandsmaschine modelliert werden kann, ist das wahrscheinliche Zustandsmuster nicht geeignet. Wenn es bei Ihrem Problem nicht darum geht, Varianten eines komplexen Algorithmus zu kapseln, gilt die Strategie nicht.

Statische Struktur des Musters

Der Status hat die folgende UML-Klassenstruktur:

PlantUML-Klassendiagramm des Zustandsmusters

Die Strategie hat die folgende UML-Klassenstruktur:

PlantUML-Klassendiagramm des Strategiemusters

Zusammenfassung: In Bezug auf die statische Struktur sind diese beiden Muster größtenteils identisch. Tatsächlich sind Mustererkennungswerkzeuge wie dieses der Ansicht, dass " die Struktur der [...] Muster identisch ist und ihre Unterscheidung durch einen automatischen Prozess verhindert (z. B. ohne Bezugnahme auf konzeptionelle Informationen) ".

Es kann jedoch einen großen Unterschied geben, wenn ConcreteStates die Zustandsübergänge selbst bestimmen (siehe die Assoziationen " möglicherweise bestimmen " im obigen Diagramm). Dies führt zu einer Kopplung zwischen konkreten Zuständen. Beispiel (siehe nächster Abschnitt), Status A bestimmt den Übergang zu Status B. Wenn die Context-Klasse den Übergang zum nächsten konkreten Status entscheidet, verschwinden diese Abhängigkeiten.

Dynamik des Musters

Wie im Abschnitt oben Problem erwähnt, Staat bedeutet , dass Verhaltensänderungen zur Laufzeit in Abhängigkeit von einem gewissen Zustand eines Objekts. Daher ist der Begriff der staatlichen transitioning Anwendung findet, wie bei der Beziehung der diskutierten finite Zustandsmaschine . [GoF] erwähnt, dass Übergänge entweder in den ConcreteState-Unterklassen oder an einem zentralen Ort (z. B. einem tabellenbasierten Ort) definiert werden können.

Nehmen wir eine einfache endliche Zustandsmaschine an:

PlantUML-Zustandsübergangsdiagramm mit zwei Zuständen und einem Übergang

Angenommen, die Unterklassen entscheiden über den Statusübergang (durch Rückgabe des nächsten Statusobjekts), sieht die Dynamik ungefähr so ​​aus:

PlantUML-Sequenzdiagramm für Zustandsübergänge

Um die Dynamik der Strategie zu zeigen , ist es nützlich, ein echtes Beispiel auszuleihen .

PlantUML-Sequenzdiagramm für Strategieübergänge

Zusammenfassung : Jedes Muster verwendet einen polymorphen Aufruf, um je nach Kontext etwas zu tun. Im Zustandsmuster bewirkt der polymorphe Aufruf (Übergang) häufig eine Änderung des nächsten Zustands . Im Strategiemuster ändert der polymorphe Anruf normalerweise nicht den Kontext (z. B. bedeutet das einmalige Bezahlen mit Kreditkarte nicht, dass Sie das nächste Mal mit PayPal bezahlen). Auch hier wird die Dynamik des Zustandsmusters durch die entsprechende Fininte-Zustandsmaschine bestimmt, was (für mich) für die korrekte Anwendung dieses Musters wesentlich ist.

Fuhrmanator
quelle
Diese Antwort war für mich sehr hilfreich, um den Unterschied zu erkennen. Das Argument der Zustandsmaschine scheint meiner Meinung nach relevant zu sein. Dies fasst die obigen Antworten tatsächlich auf theoretische Weise in der Informatik zusammen.
Medunes
Diese Antwort ist sehr hilfreich, für mich ist dies die beste.
Chofoteddy
25

Das Strategiemuster umfasst das Verschieben der Implementierung eines Algorithmus aus einer Hosting-Klasse und das Einfügen in eine separate Klasse. Dies bedeutet, dass die Hostklasse nicht die Implementierung jedes Algorithmus selbst bereitstellen muss, was wahrscheinlich zu unreinem Code führt.

Sortieralgorithmen werden normalerweise als Beispiel verwendet, da sie alle dasselbe tun (sortieren). Wenn jeder unterschiedliche Sortieralgorithmus in eine eigene Klasse eingeordnet wird, kann der Client leicht auswählen, welcher Algorithmus verwendet werden soll, und das Muster bietet eine einfache Möglichkeit, darauf zuzugreifen.

Das Statusmuster umfasst das Ändern des Verhaltens eines Objekts, wenn sich der Status des Objekts ändert. Dies bedeutet, dass die Hostklasse nicht die Implementierung des Verhaltens für alle verschiedenen Zustände bereitstellt, in denen sie sich befinden kann. Die Hostklasse kapselt normalerweise eine Klasse, die die in einem bestimmten Zustand erforderliche Funktionalität bereitstellt, und wechselt zu einer anderen Klasse wenn sich der Zustand ändert.

Ryan Spears
quelle
16

Stellen Sie sich ein IVR-System (Interactive Voice Response) vor, das Kundenanrufe verarbeitet. Möglicherweise möchten Sie es so programmieren, dass es Kunden behandelt:

  • Arbeitstage
  • Ferien

Um mit dieser Situation umzugehen, können Sie ein Statusmuster verwenden .

  • Urlaub : IVR antwortet lediglich mit den Worten: " Anrufe können nur an Werktagen zwischen 9 und 17 Uhr entgegengenommen werden ."
  • Arbeitstage : Als Antwort wird der Kunde mit einem Kundenbetreuer verbunden.

Dieser Prozess der Verbindung eines Kunden mit einem Support-Manager kann selbst mithilfe eines Strategiemusters implementiert werden, bei dem die Führungskräfte anhand einer der folgenden Kriterien ausgewählt werden:

  • Round Robin
  • Zuletzt benutzt
  • Andere prioritätsbasierte Algorithmen

Das Strategiemuster entscheidet darüber, wie eine Aktion ausgeführt werden soll, und das Statusmuster entscheidet darüber, wann sie ausgeführt werden sollen.

Murali Mohan
quelle
Dies ist eine ausgezeichnete Antwort und unterschätzt. Es wäre jedoch hilfreich zu erwähnen, warum in Ihrem Beispiel viele Algorithmen erforderlich sind. Beispielsweise wird der Algorithmus basierend auf den Präferenzen der Call Center-Firma ausgewählt. Es wäre auch hilfreich, wenn Ihre Liste einfachere oder trivialere Algorithmen für diejenigen enthält, die RR oder LRU nicht kennen. Beispiel: Langzeitkunde erhält höhere Priorität, Kunde, der am meisten gewartet hat, erhält höhere Priorität. Vielen Dank !
MasterJoe2
14

Strategie repräsentiert Objekte, die etwas "tun", mit denselben Anfangs- und Endergebnissen, aber intern unter Verwendung unterschiedlicher Methoden. In diesem Sinne sind sie analog zur Darstellung der Implementierung eines Verbs. Das Zustandsmuster OTOH verwendet Objekte, die etwas "sind" - den Zustand einer Operation. Sie können zwar auch Operationen mit diesen Daten darstellen, sind jedoch eher mit der Darstellung eines Substantivs als mit einem Verb vergleichbar und auf Zustandsautomaten zugeschnitten.

zzzeek
quelle
11

Strategie: Die Strategie ist festgelegt und besteht normalerweise aus mehreren Schritten. (Das Sortieren stellt nur einen Schritt dar und ist daher ein sehr schlechtes Beispiel, da es zu primitiv ist, um den Zweck dieses Musters zu verstehen.) Ihre "Hauptroutine" in der Strategie besteht darin, einige abstrakte Methoden aufzurufen. Beispiel: "Raumstrategie eingeben", "Hauptmethode" ist goThroughDoor (), was wie folgt aussieht: ApproachDoor (), if (Locked ()) openLock (); offene Tür(); enterRoom (); Wende(); Tür schließen(); if (wasLocked ()) lockDoor ();

Nun können Unterklassen dieses allgemeinen "Algorithmus" zum Bewegen von einem Raum in einen anderen Raum durch eine mögliche verschlossene Tür die Schritte des Algorithmus implementieren.

Mit anderen Worten, die Unterklasse der Strategie ändert nicht die grundlegenden Algorithmen, sondern nur einzelne Schritte.

DAS OBEN ist ein Muster der Vorlagenmethode. Fügen Sie nun zusammengehörige Schritte (Entsperren / Sperren und Öffnen / Schließen) in ihre eigenen Implementierungsobjekte ein und delegieren Sie sie an diese. Beispielsweise sind ein Schloss mit einem Schlüssel und ein Schloss mit einer Codekarte zwei Arten von Schlössern. Delegieren Sie von der Strategie an die "Step" -Objekte. Jetzt haben Sie ein Strategiemuster.

Ein Zustandsmuster ist etwas völlig anderes.

Sie haben ein Wrapping-Objekt und das Wrapped-Objekt. Der eingewickelte ist der "Staat". Auf das Statusobjekt wird nur über seinen Wrapper zugegriffen. Jetzt können Sie das umschlossene Objekt jederzeit ändern, sodass der Wrapper seinen Status oder sogar seine "Klasse" oder seinen Typ zu ändern scheint.

ZB haben Sie einen Anmeldedienst. Es akzeptiert einen Benutzernamen und ein Passwort. Es gibt nur eine Methode: logon (String userName, String passwdHash). Anstatt selbst zu entscheiden, ob eine Anmeldung akzeptiert wird oder nicht, delegiert sie die Entscheidung an ein Statusobjekt. Dieses Statusobjekt prüft normalerweise nur, ob die Benutzer / Pass-Kombination gültig ist, und führt eine Anmeldung durch. Jetzt können Sie den "Checker" gegen einen austauschen, bei dem sich nur privilegierte Benutzer anmelden können (z. B. während der Wartungszeit), oder gegen einen, bei dem sich niemand anmelden kann. Das heißt, der "Checker" drückt den "Anmeldestatus" des Systems aus.

Der wichtigste Unterschied ist: Wenn Sie eine Strategie gewählt haben, bleiben Sie dabei, bis Sie damit fertig sind. Das heißt, Sie nennen es "Hauptmethode" und solange diese ausgeführt wird, ändern Sie nie die Strategie. OTOH In einer Zustandsmustersituation während der Laufzeit Ihres Systems ändern Sie den Zustand beliebig, wie Sie es für richtig halten.

Angel O'Sphere
quelle
9

Das Strategiemuster wird verwendet, wenn Sie mehrere Algorithmen für eine bestimmte Aufgabe haben und der Client die tatsächliche Implementierung festlegt, die zur Laufzeit verwendet werden soll.

UML-Diagramm aus dem Wiki Strategiemusterartikel:

Geben Sie hier die Bildbeschreibung ein

Hauptmerkmale:

  1. Es ist ein Verhaltensmuster.
  2. Es basiert auf Delegation.
  3. Es ändert die Eingeweide des Objekts, indem es das Methodenverhalten ändert.
  4. Es wird verwendet, um zwischen einer Familie von Algorithmen zu wechseln.
  5. Es ändert das Verhalten des Objekts zur Laufzeit.

Weitere Informationen und Beispiele aus der Praxis finden Sie in diesem Beitrag:

Beispiel aus der Praxis für das Strategiemuster

Mit dem Statusmuster kann ein Objekt sein Verhalten ändern, wenn sich sein interner Status ändert

UML-Diagramm aus dem Wiki- Statusmusterartikel:

Geben Sie hier die Bildbeschreibung ein

Wenn wir das Verhalten eines Objekts basierend auf seinem Status ändern müssen, können wir eine Statusvariable im Objekt haben und den if-else-Bedingungsblock verwenden, um verschiedene Aktionen basierend auf dem Status auszuführen. Das Zustandsmuster wird verwendet, um einen systematischen und verlustgekoppelten Weg bereitzustellen, um dies durch Kontext- und Zustandsimplementierungen zu erreichen .

Weitere Informationen finden Sie in diesem journaldev- Artikel.

Hauptunterschiede zu Sourcemaking- und Journaldev- Artikeln:

  1. Der Unterschied zwischen Staat und Strategie liegt in der Bindungszeit. Die Strategie ist ein einmaliges Bindungsmuster, während der Zustand dynamischer ist .
  2. Der Unterschied zwischen Staat und Strategie liegt in der Absicht. Mit Strategy ist die Wahl des Algorithmus ziemlich stabil . Bei Status bewirkt eine Änderung des Status des "Kontext" -Objekts, dass es aus seiner "Palette" von Strategieobjekten auswählt .
  3. Kontext enthält Zustand als Instanzvariable , und es kann mehr Aufgaben , deren Ausführung sein kann auf dem abhängig seinen Zustand während in Strategiemustern Strategie als Argument an die Methode übergeben wird und Kontextobjekt hat keine Variable zu speichern.
Ravindra Babu
quelle
5

In Laiensprache,

Im Strategiemuster gibt es keine Zustände oder alle haben denselben Zustand. Alles, was man hat, sind verschiedene Arten, eine Aufgabe auszuführen, wie verschiedene Ärzte dieselbe Krankheit desselben Patienten mit demselben Zustand auf unterschiedliche Weise behandeln.

Im Zustandsmuster gibt es subjektiv Zustände wie den aktuellen Zustand des Patienten (z. B. hohe Temperatur oder niedrige Temperatur), auf deren Grundlage die nächste Vorgehensweise (Verschreibung von Medikamenten) festgelegt wird. Und ein Zustand kann zu einem anderen Zustand führen, also gibt es einen Zustand Abhängigkeit angeben (Zusammensetzung technisch).

Wenn wir technisch versuchen, es zu verstehen, basierend auf dem Codevergleich von beiden, verlieren wir möglicherweise die Subjektivität der Situation, da beide sehr ähnlich aussehen.

pkgrocz
quelle
2

Beide Muster delegieren an eine Basisklasse mit mehreren Ableitungen, aber nur im Statusmuster enthalten diese Ableitungsklassen einen Verweis auf die Kontextklasse.

Eine andere Sichtweise ist, dass das Strategiemuster eine einfachere Version des Zustandsmusters ist. ein Untermuster, wenn Sie möchten. Es hängt wirklich davon ab, ob die abgeleiteten Zustände Verweise auf den Kontext enthalten sollen oder nicht (dh, ob sie Methoden für den Kontext aufrufen sollen).

Für weitere Informationen: Robert C Martin (& Micah Martin) beantworten dies in ihrem Buch "Agile Prinzipien, Muster und Praktiken in C #". ( http://www.amazon.com/Agile-Principles-Patterns-Practices-C/dp/0131857258 )

Adrian K.
quelle
2

Dies ist eine ziemlich alte Frage, aber ich habe auch nach den gleichen Antworten gesucht und das habe ich entdeckt.

Betrachten Sie für das Statusmuster ein Beispiel für die Schaltfläche "Medial Player Play". Wenn wir spielen, beginnt es zu spielen und macht den Kontext darauf aufmerksam, dass es spielt. Jedes Mal, wenn der Client eine Spieloperation ausführen möchte, überprüft er den aktuellen Status des Spielers. Jetzt weiß der Client, dass der Status des Objekts über das Kontextobjekt abgespielt wird, und ruft die Aktionsmethode für Objekte mit Pausenstatusobjekten auf. Der Teil des Kunden, der den Status erkennt und weiß, in welchem ​​Status er Maßnahmen ergreifen muss, kann automatisiert werden.

https://www.youtube.com/watch?v=e45RMc76884 https://www.tutorialspoint.com/design_pattern/state_pattern.htm

Im Fall des Strategiemusters entspricht die Anordnung des Klassendiagramms dem Zustandsmuster. Der Kunde kommt zu dieser Vereinbarung, um eine Operation durchzuführen. Das heißt, anstelle der unterschiedlichen Zustände gibt es unterschiedliche Algorithmen, beispielsweise unterschiedliche Analysen, die für das Muster durchgeführt werden müssen. Hier teilen die Clients dem Kontext mit, was sie mit welchem ​​Algorithmus (Business Defined Custom Algorithmus) tun möchten, und führen dies dann aus.

https://www.tutorialspoint.com/design_pattern/strategy_pattern.htm

Beide implementieren das Open-Close-Prinzip, sodass der Entwickler dem Statusmuster und dem neuen Algorithmus neue Zustände hinzufügen kann.

Der Unterschied besteht jedoch darin, was sie verwendet werden. Dies ist ein Zustandsmuster, mit dem unterschiedliche Logik basierend auf einem Zustand des Objekts ausgeführt wird. Und im Falle einer Strategie andere Logik.

Ameya
quelle
2

Der Zustand weist einige Abhängigkeiten innerhalb der vom Staat abgeleiteten Klassen auf: Wie ein Staat weiß, dass andere Zustände nach ihm kommen. Zum Beispiel kommt der Sommer nach dem Winter für jeden Jahreszeitzustand oder der Lieferzustand nach dem Einzahlungsstatus für den Einkauf.

Andererseits hat Strategy keine solchen Abhängigkeiten. Hier kann jede Art von Status basierend auf dem Programm- / Produkttyp initialisiert werden.

MH Rahman
quelle
1

Der Unterschied wird unter http://c2.com/cgi/wiki?StrategyPattern erläutert . Ich habe das Strategiemuster verwendet, um die Auswahl verschiedener Algorithmen innerhalb eines Gesamtrahmens für die Analyse von Daten zu ermöglichen. Dadurch können Sie Algorithmen hinzufügen, ohne die allgemeinen Frameworks und deren Logik ändern zu müssen.

Ein typisches Beispiel ist, dass Sie ein Framework zur Optimierung einer Funktion haben. Das Framework richtet die Daten und Parameter ein. Mit dem Strategiemuster können Sie Algorithmen wie Sttepest-Abfahrten, konjugierte Gradienten, BFGS usw. auswählen, ohne das Framework zu ändern.

peter.murray.rust
quelle
1

Sowohl Strategie als auch Staatsmuster haben die gleiche Struktur. Wenn Sie sich das UML-Klassendiagramm für beide Muster ansehen, sehen sie genau gleich aus, aber ihre Absicht ist völlig unterschiedlich. Das Zustandsentwurfsmuster wird verwendet, um den Zustand eines Objekts zu definieren und zu verwalten, während das Strategiemuster verwendet wird, um einen Satz austauschbarer Algorithmen zu definieren und dem Client die Auswahl eines davon zu ermöglichen. Das Strategiemuster ist also ein Client-gesteuertes Muster, während Object den Status selbst verwalten kann.

Rakesh KR
quelle
1

Kurz gesagt, mit dem Strategiemuster können wir ein Verhalten im laufenden Betrieb festlegen. Mit dem Statusmuster können wir sicher sein, dass ein Objekt sein Verhalten intern mit der Änderung seines Status ändert.

Rastaman
quelle
0

Wenn Sie ein Projekt haben, das in zwei Aufgaben unterteilt werden kann:

Aufgabe 1: Sie können einen von zwei verschiedenen Algorithmen verwenden, um Folgendes zu erreichen: alg1, alg2

Aufgabe 2: Sie können einen von drei verschiedenen Algorithmen verwenden, um Folgendes zu erreichen: alg3, alg4, alg5

alg1 und alg2 sind austauschbar; alg3, alg4 und alg5 sind austauschbar.

Die Auswahl des Algorithmus, der in Aufgabe 1 und Aufgabe 2 ausgeführt werden soll, hängt von den folgenden Zuständen ab:

Zustand 1: Sie benötigen alg1 in Aufgabe 1 und alg3 in Aufgabe 2

Zustand 2: Sie benötigen alg2 in Aufgabe 1 und alg5 in Aufgabe 2

Ihr Kontext kann das Statusobjekt von Status 1 in Status 2 ändern. Dann wird Ihre Aufgabe von alg2 und alg5 anstelle von alg1 und alg3 ausgeführt.

Sie können weitere austauschbare Algorithmen für Aufgabe 1 oder Aufgabe 2 hinzufügen. Dies ist ein Strategiemuster.

Sie können in Aufgabe 1 und Aufgabe 2 mehr Zustände mit unterschiedlichen Kombinationen von Algorithmen haben. Mit dem Zustandsmuster können Sie von einem Zustand in einen anderen wechseln und verschiedene Kombinationen von Algorithmen ausführen.

user791961
quelle
0

'Strategie' ist nur ein Algorithmus, den Sie unter verschiedenen Umständen nach Bedarf ändern können und der etwas für Sie verarbeitet. Ex. Sie können auswählen, wie eine Datei komprimiert werden soll. zip oder rar ... in einer Methode.

Aber 'State' KANN Ihr gesamtes Objektverhalten ändern, wenn es sich ändert. Sogar es kann andere Felder ändern ... deshalb hat es einen Verweis auf seinen Besitzer. Sie sollten beachten, dass das Ändern eines Objektfelds das Objektverhalten überhaupt ändern kann. Ex. Wenn Sie State0 in obj in State1 ändern, ändern Sie eine Ganzzahl in 10. Wenn wir also obj.f0 () aufrufen, das einige Berechnungen durchführt und diese Ganzzahl verwendet, wirkt sich dies auf das Ergebnis aus.

Ali Dahaghin
quelle