Befehlsentwurfsmuster

Intent

  • Kapselt eine Anforderung als Objekt ein, wodurch Sie Clients mit unterschiedlichen Anforderungen, Warteschlangen- oder Protokollanforderungen und Supportunddoable-Operationen parametrieren können.
  • „Aufruf einer Methode für ein Objekt“ in den vollständigen Objektstatus befördern
  • Ein objektorientierter Rückruf

Problem

Sie müssen Anforderungen an Objekte stellen, ohne etwas über die angeforderte Operation oder den Empfänger der Anforderung zu wissen.

Diskussion

Befehl entkoppelt das Objekt, das die Operation aufruft, von demjenigen, der weiß, wie es ausgeführt wird. Um diese Trennung zu erreichen, erstellt der Designererstellt eine abstrakte Basisklasse, die einen Empfänger (ein Objekt) mit einer Aktion (einem Zeiger auf eine Elementfunktion) abbildet. Die Basisklasse enthält eineexecute() -Methode, die einfach die Aktion auf dem Empfänger aufruft.

Alle Clients von Befehlsobjekten behandeln jedes Objekt als „Black Box“, indem sie einfach die virtuelle execute() Methode des Objekts aufrufen, wenn der Client den „Service“ des Objekts benötigt.

Eine Befehlsklasse enthält eine Teilmenge der folgenden Elemente: ein Objekt, eine Methode, die auf das Objekt angewendet werden soll, und die Argumente, die übergeben werden sollen, wenn die Methode angewendet wird. Die „execute“ -Methode des Befehls führt dann dazu, dass die Teile zusammenkommen.

Sequenzen von Befehlsobjekten können zu zusammengesetzten (oder Makro-)Befehlen zusammengesetzt werden.

Struktur

Der Client, der einen Befehl erstellt, ist nicht derselbe Client, der ihn ausführt. Diese Trennung bietet Flexibilität beim Timing und der Sequenzierung von Befehlen. Das Materialisieren von Befehlen als Objekte bedeutet, dass sie wie jedes andere Objekt übergeben, inszeniert, gemeinsam genutzt, in eine Tabelle geladen und anderweitig instrumentiert oder manipuliert werden können.

Befehlsobjekte können als „Token“ betrachtet werden, die von einem Client erstellt werden, der weiß, was zu tun ist, und an einen anderen Client übergeben werden, der über die Ressourcen dafür verfügt.

Beispiel

Mit dem Befehlsmuster können Anforderungen als Objekte gekapselt werden, wodurch Clients mit unterschiedlichen Anforderungen parametrisiert werden können.Der „Check“ in einem Diner ist ein Beispiel für ein Befehlsmuster. Die Kellnerin oder Kellnerin nimmt eine Bestellung oder einen Befehl von einem Kunden entgegen und kapselt diese Bestellung ein, indem Sie sie auf den Scheck schreibt. Die Bestellung wird dann für einen kurzen Bestellvorgang in die Warteschlange gestellt. Beachten Sie, dass die Anzahl der „Schecks“, die von jedem Kellner verwendet werden, istnicht abhängig vom Menü, und daher können sie Befehle unterstützenkochen viele verschiedene Elemente.

Checkliste

  1. Definieren Sie eine Befehlsschnittstelle mit einer Methodensignatur wie execute().
  2. Erstellen Sie eine oder mehrere abgeleitete Klassen, die eine Teilmenge der folgenden Elemente kapseln: ein „Empfänger“ -Objekt, die aufzurufende Methode, die zu übergebenden Argumente.
  3. Instanziieren Sie ein Befehlsobjekt für jede verzögerte Ausführungsanforderung.
  4. Übergeben Sie das Befehlsobjekt vom Ersteller (alias Sender) an den Aufrufer (alias Empfänger).
  5. Der Aufrufer entscheidet, wann execute() .

Faustregeln

  • Verantwortungs-, Befehls-, Vermittler- und Beobachterkette, wie Sender und Empfänger entkoppelt werden können, jedoch mit unterschiedlichen Kompromissen.Befehl gibt normalerweise eine Sender-Empfänger-Verbindung mit asubclass.
  • Chain of Responsibility kann Command verwenden, um Anforderungen als Objekte darzustellen.
  • Command und Memento fungieren als magische Token, die zu einem späteren Zeitpunkt weitergegeben und aufgerufen werden. In Command repräsentiert das Token eine Anfrage; inMemento repräsentiert es den internen Status eines Objekts zu einem bestimmten Zeitpunkt. Polymorphismus ist wichtig für Command , aber nicht für Memento, weilseine Schnittstelle ist so eng, dass ein Memento nur als avalue übergeben werden kann.
  • Command kann Memento verwenden, um den für eine Undooperation erforderlichen Status beizubehalten.
  • Makrobefehle können mit Composite implementiert werden.
  • Ein Befehl, der kopiert werden muss, bevor er in eine Verlaufsliste aufgenommen wird, fungiert als Prototyp.
  • Zwei wichtige Aspekte des Befehlsmusters: Schnittstellentrennung (der Aufrufer ist vom Empfänger isoliert), zeitliche Trennung (speichert eine Ready-to-Go-Verarbeitungsanforderung, die später angegeben wird).

Unterstützen Sie unsere kostenlose Website und besitzen Sie das eBook!

  • 22 entwurfsmuster und 8 Prinzipien ausführlich erklärt
  • 406 gut strukturierte, leicht lesbare, jargonfreie Seiten
  • 228 übersichtliche und hilfreiche Illustrationen und Diagramme
  • Ein Archiv mit Codebeispielen in 4 Sprachen
  • Alle unterstützten Geräte: EPUB / MOBI / PDF-Formate

Erfahren Sie mehr…

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.