Frage

Beiden Entwurfsmuster kapseln einen Algorithmus und entkoppeln Implementierungsdetails von ihrem Aufruf Klassen. Der einzige Unterschied, den ich erkennen kann, ist, dass die Strategie-Muster in den Parametern zur Ausführung kommen, während das Muster Befehl nicht.

Es scheint mir, dass der Befehl Muster alle Informationen zur Ausführung erfordert Verfügung zu stehen, wenn es erstellt wird, und es ist in der Lage seine Berufung zu verzögern (vielleicht als Teil eines Skripts).

Was-Bestimmungen Führer, ob ein Muster oder die andere benutzen?

War es hilfreich?

Lösung

Ich bin auch eine Verkapselung Hierarchietabelle von mehreren der GoF Entwurfsmuster zu erklären helfen, die Unterschiede zwischen diesen beiden Mustern. Hoffentlich zeigt besser, was jedes Einschlußmaterialien so meine Erklärung mehr Sinn macht.

Zunächst einmal, die Hierarchielisten der Umfang, für die ein bestimmtes Muster anwendbar ist, oder das entsprechende Muster zu verwenden, ein gewisses Maß an Detail zu verkapseln, je nachdem, welche Seite der Tabelle, die Sie beim Start.

Entwurfsmuster Einkapselung Hierarchietabelle

Wie Sie aus der Tabelle sehen können, ein Muster Strategie Objekt versteckt Details einer Implementierung des Algorithmus, so dass die Verwendung eines anderen Strategie Objekt wird die gleiche Funktionalität, aber in einer anderen Art und Weise durchzuführen. Jede Strategie Objekt kann für einen bestimmten Faktor optimiert werden oder arbeiten auf einem anderen Parameter; und durch die Verwendung einer gemeinsamen Schnittstelle, der Kontext kann sicher arbeiten entweder mit.

Das Command-Muster kapselt eine viel kleinere Detailebene als ein Algorithmus. Es kodiert für die Details benötigt, um eine Nachricht an ein Objekt senden: Empfänger, die Selektor-und Argumente. Der Vorteil eines solchen kleinen Teil der Prozessausführung Objektivierung ist, dass solche Meldungen können ohne Fest Code seine Details an verschiedenen Punkten von Zeit und Ort in allgemeiner Weise geltend gemacht werden. Es erlaubt es, Nachrichten ein- oder mehrmals aufgerufen werden, oder entlang zu den verschiedenen Teilen des Systems oder mehrerer Systeme übergeben, ohne die Details eines bestimmten Aufruf zu erfordern, bevor die Ausführung bekannt sein.

Wie ist typisch für das Design-Muster, sie erfordern nicht alle Implementierungen identisch im Detail, um die Musternamen zu tragen. Details bei der Umsetzung und in welchen Daten variieren können im Objekt im Vergleich als Methode Argumente codiert wird.

Andere Tipps

Strategien encapsulate Algorithmen. Befehle, um den Sender von dem Empfänger einer Anforderung trennen, drehen sie eine Anforderung in ein Objekt.

Wenn es ein Algorithmus ist, wie wird etwas getan werden, verwenden Sie eine Strategie. Wenn Sie den Aufruf einer Methode aus seiner Ausführung verwenden Sie einen Befehl zu trennen. Die Befehle werden häufig verwendet, wenn Sie Nachrichten für die spätere Verwendung Schlange, wie eine Aufgabe oder eine Transaktion.

eine sehr alte Frage zu beantworten. (Ist jemand zu sehen neuesten Antworten statt meisten Stimmen?)

Es ist eine gültige Verwirrung wegen der Ähnlichkeiten zu haben. Beide Strategie und Kommandostrukturen nutzen Kapselung . Aber das macht sie nicht gleiche machen.

Der wesentliche Unterschied ist, zu verstehen was verkapselt ist. Das OO-Prinzip, beiden Muster sind abhängig von, ist Encapsulate was ändert .

Bei der Strategie, was variiert ist Algorithmus . Zum Beispiel weiß man Strategie-Objekt, wie die Ausgabe in XML-Datei, während die anderen Ausgänge auf, sagen wir, JSON. Verschiedene Algorithmen gehalten werden ( gekapselter ) in verschiedenen Klassen. Es ist so einfach wie das.

Bei Befehl variiert, was die Anfrage selbst. Antrag kann kommen aus File Menu > Delete oder Right Click > Context Menu > Delete oder Just Delete Button pressed. Alle drei Fälle können 3 Befehlsobjekte gleichen Typs erzeugen. Diese Befehlsobjekte stellen nur 3 Anfragen zum Löschen; nicht Löschalgorithmus. Da Anfragen jetzt Haufen Objekte sind, könnten wir sie einfach verwalten. Plötzlich wird es trivial Funktionen wie Undo oder Redo zur Verfügung zu stellen.

Es spielt keine Rolle, wie Befehl implementiert die angeforderte Logik. Beim Aufruf execute () kann es einen Algorithmus Trigger Löschen implementieren oder es kann sogar auf andere Objekte übertragen, kann sogar auf eine Strategie delegieren. Es ist nur Implementierungsdetail des Befehlsmusters. Deshalb ist es so genannt wird Befehl obwohl es nicht eine höfliche Art zu Anfrage : -)

Kontrast mit Strategie; dieses Muster nur mit der tatsächlichen Logik , das wird ausgeführt betroffen ist. Wenn wir das tun, hilft es, verschiedene Kombinationen von Verhaltensweisen, die mit minimalem Satz von Klassen zu erreichen, so Klasse Explosion zu verhindern.

Ich denke, Befehl hilft uns, unser Verständnis der Verkapselung zu erweitern, während Strategie natürliche Nutzung der Kapselung und Polymorphismus liefert.

Die Art und Weise, dass ich es sehe, ist, dass Sie mehr Möglichkeiten, das Gleiche zu tun haben, jede von denen ist eine Strategie, und etwas zur Laufzeit bestimmt, welche Strategie ausgeführt wird.

Vielleicht zuerst StrategyOne versuchen, wenn die Ergebnisse nicht gut genug sind, versuchen StrategyTwo ...

Die Befehle werden an verschiedene Dinge gebunden, die wie TryToWalkAcrossTheRoomCommand passieren müssen. Dieser Befehl wird gefeuert werden, wenn ein Objekt sollte durch den Raum zu gehen versuchen, aber innen ist es, könnte es versuchen StrategyOne und StrategyTwo für den Versuch, quer durch den Raum zu gehen.

Mark

Ich könnte meiner Meinung nach falsch sein, aber ich behandle den Befehl als Funktion-to- ausführen oder Reaktion. Es sollte mindestens zwei Spielern spielen: derjenige, der die Aktion anfordert, und derjenige, der die Aktion ausführt. GUI ist ein typisches Beispiel für Befehlsmuster:

  • Alle Tasten auf Leiste mit einer Aktion verbunden ist.
  • Button ist der Vollstrecker in diesem Fall.
  • Aktion ist der Befehl in diesem Fall.

Der Befehl wird in der Regel bis zu einem gewissen Umfang oder Geschäftsfeld begrenzt, aber nicht notwendig: Sie Befehle haben, die eine Rechnung auszustellen, eine Rakete starten oder eine Datei entfernen die gleiche Schnittstelle (zum Beispiel einzelne execute() Methode) innerhalb einer Anwendung zu implementieren. Oft Befehle sind selbst enthalten, so dass sie etwas von dem Testamentsvollstrecker nicht brauchen, um die Aufgabe sie beabsichtigen, zu verarbeiten (alle notwendigen Informationen an Bauzeit gegeben), manchmal Befehle sind kontextsensitiv und sollen diesen Zusammenhang zu entdecken, die Lage sein, ( Rücktaste Befehl, um die Position der Einfügemarke im Text korrekt das vorherige Zeichen entfernen wissen sollte; Zurücksetzen Befehl sollte die aktuelle Transaktion rückgängig zu machen entdecken, ...).

Die Strategie ein bisschen anders ist: es ist bis zu einem gewissen Gebiet gebunden. Die Strategie kann eine Regel definieren, ein Datum zu formatieren (in UTC? Locale spezifischen?) ( „Date Formatierer“ -Strategie) oder ein Quadrat für eine geometrische Figur ( „square-Rechner“ -Strategie) zu berechnen. Strategien sind in diesem Sinne Fliegengewicht Objekten, die etwas nimmt als Eingabe ( „Datum“, „Figur“, ...) und eine Entscheidung über seine Basis machen. Vielleicht nicht das beste, aber gute Beispiel für Strategie ist ein mit javax.xml.transform.Source Schnittstelle verbunden: je nachdem, ob das übergebene Objekt ist DOMSource oder SAXSource oder StreamSource die Strategie (= XSLT Transformator in diesem Fall) unterschiedliche Regeln gelten, sie zu verarbeiten. Die Implementierung kann eine einfache switch sein oder Verantwortungskette Muster einzubeziehen.

Aber in der Tat ist es etwas gemeinsam zwischen diesen beiden Mustern. Befehle und Strategien Algorithmen innerhalb des gleichen semantischen Bereichs kapseln

Befehl:

Grundkomponenten:

  1. Befehl deklariert eine Schnittstelle für abstrakte Befehle wie execute()
  2. Empfänger weiß, wie einen bestimmten Befehl auszuführen
  3. Invoker hält ConcreteCommand , die ausgeführt werden muss, um
  4. Client schafft ConcreteCommand und assign Empfänger
  5. ConcreteCommand definiert Bindung zwischen Befehl und Empfänger

Workflow:

Client Anrufe Invoker => Invoker Anrufe ConcreteCommand => ConcreteCommand Anrufe Empfänger Methode, die Arbeitsgeräte abstrakt Befehl Methode.

Vorteil: : Client wird nicht beeinflusst Änderungen in Command und Empfänger. Invoker liefern lose Kopplung zwischen Auftraggeber und Empfänger. Sie können mehrere Befehle mit dem gleichen Frages ausgeführt werden.

Befehl Muster ermöglicht es Ihnen, einen Befehl auf verschiedenen Empfänger auszuführen, indem gleiche mit Invoker . Fragesteller sind nicht bekannt Art von Empfänger

Zum besseren Verständnis von Konzepten, haben einen Blick auf diese JournalDev Artikel von Pankaj Kumar und Artikel von James Sugrue zusätzlich zu Wikipedia-Link.

Sie können mit Befehl Muster

  1. Entkoppeln der Aufrufer & Empfänger des Befehls

  2. Implementieren Callback-Mechanismus

  3. Implementieren Undo und Redo-Funktionalität

  4. Pflegen Sie eine Geschichte von Befehlen

java.lang.Thread ist eine gute Umsetzung von Befehl Muster. Sie können behandeln Thema als Aufrufer & Klasse Umsetzung Runnable als ConcreteCommonad / Empfänger und run() Methode als Befehl .

Undo / Redo-Version Befehlsmuster kann in Theodore Norvell die gelesen werden Artikel

Strategie:

Strategie-Muster ist sehr einfach zu verstehen. Verwenden Sie dieses Muster, wenn

Sie haben mehrere Implementierungen für einen Algorithmus und Implementierung des Algorithmus kann zur Laufzeit ändern zu bestimmten Bedingungen abhängig .

Nehmen wir ein Beispiel von Airline-Buchungssystem des Tarifkomponente

würden Airlines mögen verschiedene Tarife während verschiedener Zeitperioden bieten - Peak und Off Peak Monate. Während Off Peak Reisetage, es möchte die Nachfrage stimulieren, indem sie attraktive Rabatte anbieten.

SCHLUSSELERKENNTNISSE von Strategie Muster:

  1. Es ist ein Verhaltensmuster
  2. Es basiert auf Delegation
  3. Es ändert sich Mut des Objekts durch Verfahren Verhalten modifiziert
  4. Es ist, um zwischen Familie von Algorithmen verwendet,
  5. Es ändert sich das Verhalten des Objekts zur Laufzeit

Related posts mit Code-Beispiele:

Verwenden von Befehl Design-Muster

Real World Beispiel für die Strategie-Muster

Für mich ist der Unterschied eine Absichts. Die Implementierungen beider Muster sind ziemlich ähnlich, haben aber unterschiedliche Zwecke:

  • Für eine Strategie, die Komponente das Objekt mit weiß was das Objekt tut (und wird es verwenden, um einen Teil seiner eigenen Arbeit zu verrichten), aber es schert sich nicht wie es tut.

  • Für einen Befehl, die Komponente des Objekt mit kennt weder was der Befehl tut noch wie es tut - es ist nur weiß, wie es zu berufen. Die Aufgabe des Anrufers ist nur um den Befehl auszuführen -. Die Verarbeitung durch den Befehl ausgeführt nicht Teil der Kernarbeit des Anrufers bildet

Das ist der Unterschied - hat das Objekt die Komponente tatsächlich wissen oder kümmern uns um, was die Komponente tut? Die meiste Zeit kann dies anhand festgestellt werden, ob das Musterobjekt Wert auf seine Aufrufer zurückgibt. Wenn die Aufrufer Sorgen über das, was das Muster Objekt tut, dann wird es wahrscheinlich wollen sie etwas zurück und es wird eine Strategie sein. Wenn es nicht um jeden Rückgabewert schert ist es wahrscheinlich ein Befehl (beachten Sie, so etwas wie ein Java Callable noch ein Befehl ist, weil, obwohl es einen Wert zurückgibt, wird der Anrufer nicht über den Wert kümmern - es gibt sie nur zurück auf das, was ursprünglich das Command) zugeführt wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top