JavaRush /Java-Blog /Random-DE /Unterschied zwischen Zustands- und Strategiemustern in Ja...
0xFF
Level 9
Донецк

Unterschied zwischen Zustands- und Strategiemustern in Java

Veröffentlicht in der Gruppe Random-DE
Um die Zustands- und Strategiemuster in Java-Kernanwendungen richtig nutzen zu können, ist es für Java-Programmierer wichtig, den Unterschied zwischen ihnen klar zu verstehen. Obwohl beide Muster, State und Strategy, eine ähnliche Struktur haben und beide auf dem Offen/Geschlossen-Prinzip basieren, das das „O“ in SOLID-Prinzipien darstellt , unterscheiden sie sich in ihrer Absicht völlig . Unterschied zwischen Zustands- und Strategiemustern in Java – 1Das Strategiemuster in Java wird verwendet, um verwandte Algorithmensätze zu kapseln, um dem Client Ausführungsflexibilität zu bieten . Der Client kann zur Laufzeit einen beliebigen Algorithmus auswählen, ohne den Kontext der Klasse zu ändern, die den Algorithmus verwendet . Einige beliebte Beispiele für das Strategiemuster sind das Schreiben von Code, der Algorithmen wie Verschlüsselung, Komprimierung oder Sortierung verwendet. Andererseits ermöglicht das Zustandsmuster einem Objekt, sich in verschiedenen Zuständen unterschiedlich zu verhalten. Denn in der realen Welt hat ein Objekt oft Zustände und verhält sich in verschiedenen Zuständen unterschiedlich. Beispielsweise verkauft ein Verkaufsautomat nur Waren, wenn er sich im Zustand befindet, und verkauft ihn erst, wenn man eine Münze hineinwirft. Jetzt können Sie den Unterschied zwischen den Strategie- und Staatsmustern deutlich erkennen, es handelt sich dabei um unterschiedliche Absichten. Das Zustandsmuster hilft einem Objekt bei der Zustandsverwaltung, während das Strategiemuster es dem Client ermöglicht, ein anderes Verhalten auszuwählen. Ein weiterer Unterschied, der nicht so leicht zu erkennen ist, besteht darin, wer die Verhaltensänderung vorantreibt. Beim Strategy-Muster handelt es sich um einen Client, der dem Kontext verschiedene Strategien bereitstellt; beim State-Muster wird der Übergang durch den Kontext oder den Zustand des Objekts selbst gesteuert. Wenn Sie außerdem Statusänderungen im Statusobjekt selbst verwalten, muss ein Verweis auf den Kontext vorhanden sein. Beispielsweise muss ein Verkaufsautomat in der Lage sein, eine Methode aufzurufen, um den aktuellen Status des Kontexts zu ändern. Andererseits enthält das Strategy-Objekt niemals einen Verweis auf den Kontext; der Client selbst übergibt die Strategie seiner Wahl an den Kontext. Der Unterschied zwischen Zustands- und Strategiemustern ist eine der beliebtesten Interviewfragen zu Java-Mustern . In diesem Artikel über Java-Muster werden wir uns näher damit befassen. Wir werden einige Ähnlichkeiten und Unterschiede zwischen den Strategie- und Zustandsmustern in Java untersuchen, die Ihnen helfen werden, Ihr Verständnis dieser Muster zu verbessern. StrategyhasCoinsetState()

Ähnlichkeiten zwischen den Staats- und Strategiemustern

Wenn Sie sich das UML-Diagramm der Zustands- und Strategiemuster ansehen, werden Sie feststellen, dass beide einander ähnlich aussehen. Ein Objekt, das den Status verwendet, um sein Verhalten zu ändern, wird als -Objekt bezeichnet . Ebenso wird ein Objekt, das die Strategie verwendet, um sein Verhalten zu ändern, als -Objekt Contextbezeichnet . ContextDenken Sie daran, dass der Client mit Contextdem -Objekt interagiert. Im Fall des State-Musters delegiert der Kontext Aufrufmethoden an ein State-Objekt, das als aktuelles Objekt gehalten wird, und im Fall des Strategy-Musters verwendet der Kontext das Strategy-Objekt als Parameter oder wird während der Erstellung bereitgestellt des Kontexts des Objekts. UML-Diagramm des State-Musters in Java Unterschied zwischen Zustands- und Strategiemustern in Java - 2 Dieses UML-Diagramm für das State-Muster zeigt das klassische Problem der Erstellung eines objektorientierten Verkaufsautomatendesigns in Java. Sie können sehen, dass der Zustand des Verkaufsautomaten mithilfe einer Schnittstelle dargestellt wird, die dann über eine Implementierung zur Darstellung des spezifischen Zustands verfügt. Jeder Zustand verfügt außerdem über Verweise auf den Objektkontext, um als Ergebnis von im Kontext aufgerufenen Aktionen einen Übergang in einen anderen Zustand durchzuführen. UML-Diagramm des Strategiemusters in Java Unterschied zwischen Zustands- und Strategiemustern in Java - 3 Dieses UML-Diagramm für das Strategiemuster enthält funktionale Implementierungen verschiedener Art. Da es viele Sortieralgorithmen gibt, ermöglicht dieses Entwurfsmuster dem Client, beim Sortieren von Objekten einen Algorithmus auszuwählen. Tatsächlich verwendet das Java Collection-Framework dieses Muster, um eine Methode zu implementieren Collections.sort(), die zum Sortieren von Objekten in Java verwendet wird. Der einzige Unterschied besteht darin, dass der Client nicht die Möglichkeit hat, einen Sortieralgorithmus auszuwählen, sondern dass er die Vergleichsstrategie angeben kann, indem er eine Instanz der Comparator- oder Comparable-Schnittstelle an Java übergibt . Schauen wir uns einige Ähnlichkeiten zwischen diesen beiden wichtigsten Entwurfsmustern in Java an:
  1. Beide Muster, Zustand und Strategie, erleichtern das Hinzufügen neuer Zustände und Strategien, ohne den Kontext des Objekts zu beeinträchtigen, das sie verwendet.

  2. Beide verwalten Ihren Code nach dem Offen/Geschlossen-Prinzip , was bedeutet, dass das Design offen für Erweiterungen, aber gesperrt für Änderungen ist. Im Fall der Zustands- und Strategiemuster ist der Kontext des Objekts für Änderungen, die Einführung neuer Zustände oder neuer Strategien gesperrt, oder Sie müssen den Kontext des anderen Zustands nicht oder nur minimale Änderungen ändern.

  3. So wie ein Objektkontext im State-Muster mit dem Initialisierungsstatus des Objekts beginnt, verfügt ein Objektkontext auch im Fall des Strategy-Musters in Java über eine Standardstrategie.

  4. Das Zustandsmuster repräsentiert unterschiedliche Verhaltensweisen in Form unterschiedlicher Objektzustände, während das Strategiemuster unterschiedliche Verhaltensweisen in Form unterschiedlicher Objektstrategien darstellt.

  5. Beide Muster, Strategie und Zustand, hängen von Unterklassen der Verhaltensumsetzung ab. Jede konkrete Strategie erweitert eine abstrakte Strategie; jeder Zustand ist eine Unterklasse einer Schnittstelle oder abstrakten Klasse , die zur Darstellung des Zustands verwendet wird.

Unterschiede zwischen Strategie- und Zustandsmustern in Java

Jetzt wissen wir also, dass die Zustands- und Strategiemuster in ihrer Struktur ähnlich sind, ihre Absicht jedoch unterschiedlich ist. Schauen wir uns einige wichtige Unterschiede zwischen diesen Entwurfsmustern an.
  1. Das Strategiemuster kapselt eine Reihe verwandter Algorithmen und ermöglicht es dem Client, trotz Zusammensetzung und Delegation zur Laufzeit austauschbare Verhaltensweisen zu verwenden. Andererseits hilft das Zustandsmuster einer Klasse, unterschiedliche Verhaltensweisen in verschiedenen Zuständen zu zeigen.

  2. Der nächste Unterschied zwischen den State- und Strategy-Mustern besteht darin, dass State den Zustand eines Objekts kapselt , während das Strategy-Muster einen Algorithmus oder eine Strategie kapselt. Da der Status einem Objekt zugeordnet ist, kann er nicht wiederverwendet werden. Durch die Entkopplung einer Strategie oder eines Algorithmus von seinem Kontext können wir ihn jedoch wiederverwenden.

  3. Im Zustandsmuster kann ein persönlicher Zustand einen Verweis auf den Kontext enthalten, um Übergänge zwischen Zuständen zu implementieren, aber eine Strategie enthält keinen Verweis auf den Kontext, in dem sie verwendet wird.

  4. Die Implementierung einer Strategie kann als Parameter an das Objekt übergeben werden, das sie verwenden wird. Collection.sort() verwendet beispielsweise einen Komparator , der eine Strategie ist. Andererseits ist der Zustand Teil des Kontexts des Objekts selbst, und im Laufe der Zeit geht der Kontext des Objekts von einem Zustand in einen anderen über.

  5. Obwohl sowohl Strategie als auch Staat dem Offen/Geschlossen-Prinzip folgen, folgt Strategie auch dem Prinzip der Einzelverantwortung, da jede Strategie einen individuellen Algorithmus enthält und die verschiedenen Strategien unabhängig voneinander sind. Die Änderung einer Strategie erfordert nicht die Änderung einer anderen Strategie.

  6. Ein weiterer theoretischer Unterschied zwischen den Mustern „Strategie“ und „Zustand“ besteht darin, dass der Ersteller den „Wie“-Teil des Objekts definiert, z. B. „Wie“ das Sortierobjekt Daten sortiert, andererseits definiert das Muster „Zustand“ das „Was“ und „Wann“. Teile des Objekts, z. B. was ein Objekt tun kann, wenn es sich in einem bestimmten Zustand befindet.

  7. Die Reihenfolge der Zustandsübergänge ist im Zustandsmuster klar definiert; für das Strategiemuster gibt es keine solche Anforderung. Dem Kunden steht es frei, die Umsetzung der Strategie seiner Wahl zu wählen.

  8. Einige der häufigsten Beispiele für das Strategiemuster sind die Kapselung von Algorithmen, beispielsweise Sortieralgorithmen, Verschlüsselungsalgorithmen oder ein Komprimierungsalgorithmus. Wenn Sie feststellen, dass Ihr Code verschiedene Arten verwandter Algorithmen verwenden muss, sollten Sie die Verwendung des Strategiemusters in Betracht ziehen. Andererseits ist es recht einfach, die Verwendung des State-Musters zu erkennen. Wenn Sie Zustände und Zustandsübergänge ohne viele verschachtelte bedingte Anweisungen verwalten müssen, ist das State-Muster das richtige Muster.

  9. Der vorletzte der wichtigsten Unterschiede zwischen den Zustands- und Strategiemustern besteht darin, dass eine Änderung der Strategie durch den Client durchgeführt wird, während eine Änderung des Zustands durch den Kontext oder den Zustand des Objekts selbst durchgeführt werden kann.

Hier dreht sich alles um den Unterschied zwischen den State- und Strategy-Mustern in Java . Wie gesagt, beide sehen in ihren Klassen und UML-Diagrammen ähnlich aus, beide bieten Offen/Geschlossen-Prinzipien und kapseln das Verhalten. Verwenden Sie das Strategy-Muster, um einen Algorithmus oder eine Strategie zu kapseln, die zur Laufzeit dem Kontext ausgesetzt wird, möglicherweise als Parameter oder zusammengesetztes Objekt, und verwenden Sie das State-Muster, um Zustandsübergänge in Java zu steuern. Original hier
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION