it-swarm.com.de

Was ist der Unterschied zwischen Strategie-Entwurfsmuster und Status-Entwurfsmuster?

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 mir bitte jemand den Unterschied erklären?

205
Chin Tser

Ehrlich gesagt, sind die beiden Muster in der Praxis ziemlich ähnlich, und der entscheidende Unterschied zwischen ihnen hängt davon ab, 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: den Zustand des Kontextobjekts in etwas anderes ändern), Strategien dagegen nicht.
  • Strategien werden als Parameter an das Kontextobjekt übergeben, während Zustände vom Kontextobjekt selbst erstellt werden.
  • Strategien behandeln nur eine einzelne, spezifische Aufgabe, während Zustände die zugrunde liegende Implementierung für alles (oder fast alles) bereitstellen, was das Kontextobjekt tut.

Eine "klassische" Implementierung würde entweder dem Status oder der Strategie für jedes Element in der Liste entsprechen, aber Sie treffen auf Hybride, die eine Mischung aus beiden aufweisen. Ob ein bestimmter Staat mehr ist als Strategie, ist letztendlich eine subjektive Frage.

125
user597474
  • Das Strategie - Muster besteht eigentlich darin, eine andere Implementierung zu haben, die (im Grunde) dasselbe bewirkt, so dass eine Implementierung die andere ersetzen kann, wie es die Strategie erfordert. Beispielsweise können Sie in einem Strategiemuster unterschiedliche Sortieralgorithmen verwenden. Der Aufrufer des Objekts ändert sich nicht basierend auf der verwendeten Strategie, aber unabhängig von der Strategie ist das Ziel dasselbe (Sortieren der Sammlung).
  • Das State Muster handelt davon, verschiedene Dinge basierend auf dem Zustand zu tun, während der Anrufer von der Last befreit wird, jeden möglichen Zustand unterzubringen. So könnten Sie beispielsweise eine getStatus() -Methode haben, 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.
95
Yishai

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

  • Das State Muster behandelt was (Zustand oder Typ) ein Objekt ist (in) - es kapselt zustandsabhängiges Verhalten , wohingegen
  • das Strategie Muster behandelt wie ein Objekt führt eine bestimmte Aufgabe aus - es kapselt einen Algorithmus.

Die Konstrukte zum Erreichen dieser unterschiedlichen Ziele sind jedoch sehr ähnlich; Beide Muster sind Beispiele für Komposition mit Delegation.


Einige Beobachtungen zu ihren Vorteilen:

Durch Verwendung des Musters State wird die zustandshaltende (Kontext-) Klasse von der Kenntnis von what state oder type, und befreit welche Zustände oder Typen verfügbar sind. Dies bedeutet, dass die Klasse dem Open-Closed-Design-Prinzip (OCP) folgt: Die Klasse ist geschlossen, um Änderungen an den vorhandenen Zuständen/Typen zu verhindern, die Zustände/Typen sind jedoch für Erweiterungen offen.

Durch die Verwendung des Strategie Musters wird die algorithmisch verwendende (Kontext-) Klasse von der Kenntnis von wie entlastet, um eine bestimmte Aufgabe auszuführen ( - der "Algorithmus"). Dieser Fall schafft auch eine Einhaltung der OCP; Die Klasse ist wegen Änderungen in Bezug auf die Ausführung dieser Aufgabe geschlossen, das Design ist jedoch sehr offen für Hinzufügungen anderer Algorithmen zur Lösung dieser Aufgabe.
Dies verbessert wahrscheinlich auch die Einhaltung des Single Responsibility-Prinzips (SRP) durch die Kontextklasse. Weiterhin wird der Algorithmus für die Wiederverwendung durch andere Klassen leicht verfügbar.

81
Ulf Åkerstedt

Kann jemand bitte in Laienausdrücken erklären?

Designmuster sind nicht wirklich "Laien" -Konzepte, aber ich werde versuchen, es so klar wie möglich zu machen. Jedes Designmuster 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 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 Zustand ab, und es muss sein Verhalten zur Laufzeit abhängig von diesem Zustand ändern.
  • Operationen haben große, mehrteilige bedingte Anweisungen, die vom Objektstatus abhängen. Dieser Zustand wird normalerweise durch eine oder mehrere aufgezählte Konstanten dargestellt. Oft enthalten mehrere Operationen dieselbe bedingte Struktur. Das State-Muster ordnet jeden Zweig der Bedingung einer eigenen 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 mit einer Zustandsmaschine zu modellieren. Hier finden Sie ein Beispiel hier .

Jeder Zustandsübergang ist eine Methode in der Zustandsschnittstelle. Dies impliziert, dass Sie für einen Entwurf ziemlich sicher sein müssen, bevor Sie dieses Muster anwenden. Andernfalls müssen Sie beim Hinzufügen oder Entfernen von Übergängen die Schnittstelle und alle Klassen, die sie implementieren, ändern.

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

Strategie wird für die folgenden [GoF Buch S. 316] verwendet:

  • 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. Sie können beispielsweise Algorithmen definieren, die unterschiedliche räumliche/zeitliche Kompromisse widerspiegeln. Strategien können verwendet werden, wenn diese Varianten als Klassenhierarchie von Algorithmen implementiert werden [HO87].
  • ein Algorithmus verwendet Daten, die Clients nicht kennen sollten. Verwenden Sie das Strategiemuster, um zu vermeiden, dass komplexe, algorithmenspezifische Datenstrukturen verfügbar gemacht werden.
  • eine Klasse definiert viele Verhaltensweisen und diese erscheinen als mehrere bedingte Anweisungen in ihren Operationen. Verschieben Sie verwandte bedingte Zweige in ihre eigene Strategieklasse, anstatt vieler Bedingungen.

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

Zusammenfassung: Staat und Strategie lösen sehr unterschiedliche Probleme. Wenn Ihr Problem nicht mit einer 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

State hat die folgende UML-Klassenstruktur:

PlantUML class diagram of State Pattern

Strategie hat die folgende UML-Klassenstruktur:

PlantUML class diagram of Strategy Pattern

Zusammenfassung: In Bezug auf die statische Struktur sind diese beiden Muster größtenteils identisch. In der Tat betrachten Mustererkennungswerkzeuge wie dieses " die Struktur der [...] Muster ist identisch und verbietet ihre Unterscheidung durch einen automatischen Prozess (z. B. ohne Bezugnahme) zu konzeptionellen Informationen). "

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

Dynamik des Musters

Wie im obigen Problemabschnitt erwähnt, impliziert Status , dass sich das Verhalten zur Laufzeit in Abhängigkeit von einem bestimmten Status von einem ändert Objekt. Daher gilt der Begriff des Zustands Übergang, wie er mit der Beziehung der endlichen Zustandsmaschine erörtert wurde. [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 state transition diagram with two states and one transition

Angenommen, die Unterklassen entscheiden über den Zustandsübergang (indem sie das nächste Zustandsobjekt zurückgeben), sieht die Dynamik ungefähr so ​​aus:

PlantUML sequence diagram for state transitions

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

PlantUML sequence diagram for strategy transitions

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 Aufruf in der Regel 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 state machine, bestimmt, die (für mich) für die korrekte Anwendung dieses Musters wesentlich ist.

38
Fuhrmanator

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

Normalerweise werden Sortieralgorithmen als Beispiel verwendet, da sie alle dasselbe tun (sortieren). Wenn jeder unterschiedliche Sortieralgorithmus einer eigenen Klasse zugeordnet ist, kann der Client auf einfache Weise den zu verwendenden Algorithmus auswählen und das Muster bietet eine einfache Möglichkeit, darauf zuzugreifen.

Das Statusmuster beinhaltet das Ändern des Verhaltens eines Objekts, wenn sich der Status des Objekts ändert. Dies bedeutet, dass die Host-Klasse nicht die Implementierung von Verhalten für alle verschiedenen Zustände bereitstellt, in denen sie sein kann. Die Host-Klasse 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.

25
Ryan Spears

Strategie repräsentiert Objekte, die etwas "tun", mit dem gleichen Anfangs- und Endergebnis, aber intern mit unterschiedlichen Methoden. In diesem Sinne entsprechen sie der Darstellung der Implementierung eines Verbs. Das Zustandsmuster OTOH verwendet Objekte, die etwas "sind" - den Zustand einer Operation. Sie können zwar auch Operationen für diese Daten darstellen, sind jedoch der Darstellung eines Substantivs ähnlicher als eines Verbs und auf Zustandsautomaten zugeschnitten.

14
zzzeek

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

  • Arbeitstage
  • Feiertage

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

  • Feiertag: IVR antwortet einfach mit dem Hinweis: 'Anrufe können nur an Werktagen zwischen 9.00 und 17.00 Uhr entgegengenommen werden'.
  • Arbeitstage: Der Kunde wird mit einem Kundendienstmitarbeiter verbunden.

Dieser Prozess des Verbindens eines Kunden mit einer Support-Führungskraft kann selbst mithilfe eines Strategie-Musters implementiert werden, wobei die Führungskräfte auf der Grundlage einer der folgenden Kriterien ausgewählt werden:

  • Round Robin
  • zuletzt verwendet
  • Andere prioritätsbasierte Algorithmen

Das Strategiemuster entscheidet über 'wie', um eine Aktion auszuführen, und das Zustandsmuster entscheidet über 'wann', um sie auszuführen.

13
Murali Mohan

Strategie: Die Strategie ist festgelegt und besteht in der Regel 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. Z.B. "Enter Room Strategy", "main-method" ist goThroughDoor (), was so aussieht: approachDoor (), if (locked ()) openLock (); offene Tür(); enterRoom (); Wende(); Tür schließen(); if (wasLocked ()) lockDoor ();

Jetzt 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, eine Unterklasse der Strategie ändert nicht die grundlegenden Algorithmen, sondern nur einzelne Schritte.

DAS OBEN IST EIN SCHABLONENMETHODENMUSTER. Fügen Sie nun zusammengehörige Schritte (Entriegeln/Verriegeln und Öffnen/Schließen) in eigene Implementierungsobjekte ein und delegieren Sie diese an diese. Z.B. Ein Schloss mit einem Schlüssel und ein Schloss mit einer Codekarte sind zwei Arten von Schlössern. Delegieren Sie von der Strategie zu den "Schritt" -Objekten. Jetzt haben Sie ein Strategiemuster.

Ein Zustandsmuster ist etwas völlig anderes.

Sie haben ein umhüllendes Objekt und das umhüllende Objekt. Der Eingewickelte ist der "Staat". Auf das Statusobjekt wird nur über seinen Wrapper zugegriffen. Jetzt können Sie das umschlossene Objekt jederzeit ändern, so dass der Wrapper anscheinend seinen Status oder sogar seine "Klasse" oder seinen Typ ändert.

Z.B. Sie haben 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 es 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" jedoch gegen einen austauschen, bei dem sich nur berechtigte Benutzer anmelden können (z. B. während der Wartungszeit), oder gegen einen, bei dem sich niemand anmeldet. Das heißt, der "Checker" gibt den "Anmeldestatus" des Systems an.

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

11
Angel O'Sphere

Strategy Muster wird verwendet, wenn Sie mehrere Algorithmen für eine bestimmte Aufgabe haben und der Client entscheidet, welche Implementierung tatsächlich zur Laufzeit verwendet wird.

UML-Diagramm aus wiki Strategiemuster Artikel:

enter image description here

Hauptmerkmale:

  1. Es ist ein Verhaltensmuster.
  2. Es basiert auf Delegation.
  3. Es ändert die Eingeweide des Objekts, indem das Verhalten der Methode geändert wird.
  4. Es wird verwendet, um zwischen verschiedenen Algorithmen zu wechseln.
  5. Es ändert das Verhalten des Objekts zur Laufzeit.

In diesem Beitrag finden Sie weitere Informationen und Beispiele aus der Praxis:

Reales Beispiel des Strategiemusters

State Muster ermöglicht es einem Objekt, sein Verhalten zu ändern, wenn sich sein interner Zustand ändert

UML-Diagramm aus wiki Statusmuster Artikel:

enter image description here

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. State Pattern wird verwendet, um einen systematischen und lose gekoppelten Weg zu bieten, um dies durch Context und State Implementierungen.

Weitere Informationen finden Sie in diesem journaldev Artikel.

Hauptunterschiede zu den Artikeln sourcemaking und journaldev :

  1. Der Unterschied zwischen State und Strategy liegt in der Bindungszeit. Die Strategie ist ein Bind-Once-Muster, während State dynamischer ist.
  2. Der Unterschied zwischen State und Strategy liegt in der Absicht. Mit Strategy ist die Wahl des Algorithmus ziemlich stabil. Mit State bewirkt eine Änderung des Status des "Kontext" -Objekts, dass es aus seiner "Palette" von Strategieobjekten auswählt.
  3. Context enthält state als Instanzvariable und es kann mehrere Tasks geben, deren Implementierung von state abhängig sein kann, wohingegen in strategy Muster Strategie wird als Argument an die Methode übergeben und Kontext Objekt hat keine Variable, um es zu speichern.
9
Ravindra babu

In der Sprache des Laien

im Strategiemuster gibt es keine Status oder alle haben denselben Status. Alle haben verschiedene Möglichkeiten, eine Aufgabe auszuführen, so wie verschiedene Ärzte die gleiche Krankheit eines Patienten mit dem gleichen 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 des Arzneimittels) festgelegt wird. Und ein Zustand kann zu einem anderen Zustand führen, so dass es einen Zustand gibt Abhängigkeit angeben (Zusammensetzung technisch).

Wenn wir technisch versuchen, es auf der Grundlage eines Codevergleichs beider zu verstehen, verlieren wir möglicherweise die Subjektivität der Situation, da beide sehr ähnlich aussehen.

5
pkgrocz

Dies ist eine ziemlich alte Frage, aber ich habe immer noch nach den gleichen Antworten gesucht und dies ist, was ich entdeckt habe.

Betrachten wir als 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 Players. Jetzt weiß der Client, dass der Status des Objekts über das Kontextobjekt wiedergegeben wird, und ruft die Aktionsmethode pause state objects auf. Der Teil des Clients, der den Status erkennt und in welchem ​​Status er Aktionen ausführen muss, kann automatisiert werden.

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

Im Fall von Strategiemuster entspricht die Anordnung des Klassendiagramms dem Statusmuster. Der Kunde kommt zu dieser Vereinbarung, um eine Operation durchzuführen. Das heißt, anstelle der verschiedenen Zustände gibt es verschiedene Algorithmen, beispielsweise verschiedene 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 algorithm) tun wollen und führen diesen dann aus.

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

Beide Implementierungen öffnen und schließen das Prinzip, sodass der Entwickler dem Statusmuster und dem neuen Algorithmus neue Status hinzufügen kann.

Der Unterschied besteht jedoch darin, welche Statusmuster verwendet werden, um unterschiedliche Logik basierend auf einem Status des Objekts auszuführen. Und im Falle einer Strategie eine andere Logik.

2
Ameya

Beide Muster werden an eine Basisklasse mit mehreren Ableitungen delegiert. Diese Ableitungsklassen enthalten jedoch nur im Statusmuster 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 zurückhalten sollen oder nicht (d. H. 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 )

2
Adrian K

Der Zustand kommt mit ein wenig Abhängigkeiten innerhalb der vom Zustand abgeleiteten Klassen: als ob ein Zustand andere Zustände kennt, die nach ihm kommen. Zum Beispiel kommt der Sommer nach dem Winter für einen beliebigen Saisonstatus oder der Lieferstatus nach dem Einzahlungsstatus für den Einkauf.

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

2
M H Rahman

Der Unterschied wird in http://c2.com/cgi/wiki?StrategyPattern erläutert. Ich habe das Strategiemuster verwendet, um die Auswahl verschiedener Algorithmen innerhalb eines Gesamtrahmens für die Datenanalyse 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 "Steppest-Abstieg", "Konjugierte Verläufe", "BFGS" usw. auswählen, ohne das Framework zu ändern.

1

Sowohl Strategie als auch Zustandsmuster 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 zum Definieren und Verwalten des Zustands eines Objekts verwendet, während das Strategiemuster zum Definieren eines Satzes austauschbarer Algorithmen verwendet wird und es dem Client ermöglicht, einen von ihnen auszuwählen. Das Strategiemuster ist also ein clientgesteuertes Muster, während Object den Status selbst verwalten kann.

1
Rakesh KR

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

1
rastaman

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

aufgabe 1: Sie können einen von zwei verschiedenen Algorithmen verwenden: alg1, alg2

aufgabe 2: Sie können einen von drei verschiedenen Algorithmen verwenden: alg3, alg4, alg5

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

Die Auswahl des in Aufgabe 1 und Aufgabe 2 auszuführenden Algorithmus hängt von den Zuständen ab:

zustand 1: sie brauchen alg1 in aufgabe 1 und alg3 in aufgabe 2

zustand 2: Sie brauchen alg2 in Aufgabe 1 und alg5 in Aufgabe 2

Ihr Kontext kann das Statusobjekt von Status 1 in Status 2 ändern. Dann würde 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 mehrere Zustände mit unterschiedlichen Kombinationen von Algorithmen haben. Mithilfe des Zustandsmusters können Sie von einem Zustand in einen anderen wechseln und unterschiedliche Kombinationen von Algorithmen ausführen.

0
user791961