Befehl-Muster

In der objektorientierten Programmierung ist das Befehl-Muster ein Designmuster, in dem ein Gegenstand verwendet wird, um die ganze Information zu vertreten und kurz zusammenzufassen, musste eine Methode in einer späteren Zeit nennen. Diese Information schließt den Methode-Namen, der Gegenstand ein, der die Methode besitzt und für die Methode-Rahmen schätzt.

Drei mit dem Befehl-Muster immer vereinigte Begriffe sind Kunde, invoker und Empfänger. Der Kunde realisiert den Befehl-Gegenstand und gibt die Auskunft, die erforderlich ist, die Methode in einer späteren Zeit zu nennen. Der invoker entscheidet, wenn die Methode genannt werden sollte. Der Empfänger ist ein Beispiel der Klasse, die den Code der Methode enthält.

Das Verwenden von Befehl-Gegenständen macht es leichter, allgemeine Bestandteile zu bauen, die, Folge delegieren oder Methode durchführen müssen, besucht eine Zeit ihrer Auswahl ohne das Bedürfnis, den Eigentümer der Methode oder der Methode-Rahmen zu kennen.

Gebrauch

Befehl-Gegenstände sind für das Einführen nützlich:

Mehrniveau macht auf: Wenn alle Benutzermaßnahmen in einem Programm getroffen werden, weil Befehl protestiert, kann das Programm einen Stapel der am meisten kürzlich durchgeführten Befehle behalten. Wenn der Benutzer einen Befehl aufmachen will, lässt das Programm einfach den neusten Befehl-Gegenstand knallen und führt seine Methode durch.

Verhalten von Transactional: Ähnlich, um aufzumachen, können ein Datenbankmotor oder Softwaremonteur eine Liste von Operationen behalten, die gewesen sind oder durchgeführt werden. Wenn einer von ihnen, alles scheitert, was andere zurückgekehrt oder verworfen werden können (gewöhnlich hat rollback genannt). Zum Beispiel, wenn zwei Datenbanktische, die sich auf einander beziehen, aktualisiert werden müssen, und die zweite Aktualisierung scheitert, kann die Transaktion wiederholt werden, so dass der erste Tisch keine ungültige Verweisung jetzt enthält.

Fortschritt-Bars: Nehmen Sie An, dass ein Programm eine Folge von Befehlen hat, die es in der Ordnung durchführt. Wenn jeder Befehl-Gegenstand eine Methode hat, kann das Programm die Gesamtdauer leicht schätzen. Es kann eine Fortschritt-Bar zeigen, die bedeutungsvoll widerspiegelt, wie nahe das Programm zur Vollendung aller Aufgaben ist.

Zauberer: Häufig präsentiert ein Zauberer mehrere Seiten der Konfiguration für eine einzelne Handlung, die nur geschieht, wenn der Benutzer auf die Taste "Finish" auf der letzten Seite klickt. In diesen Fällen soll eine natürliche Weise, Benutzerschnittstelle-Code vom Anwendungscode zu trennen, den Zauberer durchführen, der einen Befehl-Gegenstand verwendet. Der Befehl-Gegenstand wird geschaffen, wenn der Zauberer zuerst gezeigt wird. Jede Zauberseite versorgt seine GUI-Änderungen im Befehl-Gegenstand, so wird der Gegenstand bevölkert, als der Benutzer fortschreitet. "Schluss" löst einfach einen Anruf aus. Auf diese Weise enthält die Befehl-Klasse keinen Benutzerschnittstelle-Code.

GUI Knöpfe und Menüpunkte: In der Programmierung von Swing und Borland Delphi, eines Befehl-Gegenstands zu sein. Zusätzlich zur Fähigkeit, den gewünschten Befehl durchzuführen, hat ein Können eine verbundene Ikone, Tastatur-Abkürzung, tooltip Text und so weiter. Ein Werkzeugleiste-Knopf oder Menüpunkt-Bestandteil können mit nur den Gegenstand völlig initialisiert werden.

Faden-Lachen: Eine typische Mehrzweckfaden-Lache-Klasse könnte eine öffentliche Methode haben, die einen Arbeitsartikel zu einer inneren Warteschlange von Aufgaben hinzufügt, die warten, um getan zu werden. Es erhält eine Lache von Fäden aufrecht, die Befehle von der Warteschlange durchführen. Die Sachen in der Warteschlange sind Befehl-Gegenstände. Normalerweise führen diese Gegenstände eine allgemeine Schnittstelle wie das durch erlaubt der Faden-Lache, den Befehl durchzuführen, wenn auch die Faden-Lache-Klasse selbst ohne irgendwelche Kenntnisse der spezifischen Aufgaben geschrieben wurde, für die es verwendet würde.

Makroaufnahme: Wenn alle Benutzerhandlungen durch Befehl-Gegenstände vertreten werden, kann ein Programm eine Folge von Handlungen einfach durch das Halten einer Liste der Befehl-Gegenstände registrieren, weil sie durchgeführt werden. Es kann dann dieselben Handlungen durch die Durchführung derselben Befehl-Gegenstände wieder in der Folge "abspielen". Wenn das Programm einen scripting Motor einbettet, kann jeder Befehl-Gegenstand eine Methode durchführen, und Benutzerhandlungen können dann als Schriften leicht registriert werden.

Netzwerkanschluss: Es ist möglich, ganze Befehl-Gegenstände über das Netz zu senden, das auf den anderen Maschinen, zum Beispiel Spieler-Handlungen in Computerspielen durchzuführen ist.

Parallele Verarbeitung: Wo die Befehle als Aufgaben einer geteilten Quelle geschrieben und durch viele Fäden in der Parallele durchgeführt werden (vielleicht auf entfernten Maschinen - wird diese Variante häufig das Muster des Masters/Arbeiters genannt)

Beweglicher Code: Das Verwenden von Sprachen wie Java, wo Code von einer Position bis einen anderen über URLClassloaders und Codebases die Befehle geströmt/geschlürft werden kann, kann neuem Verhalten ermöglichen, an abgelegene Standorte (EJB Befehl, Master-Arbeiter) geliefert zu werden

Struktur

  • Die Erklärung für den Empfänger-Block sollte oben "Die wirkliche Arbeit sein, die durch den Befehl (Handlung)" zu tun
ist

Fachsprache

Die Fachsprache, die verwendet ist, um Befehl-Muster-Durchführungen zu beschreiben, entspricht nicht und kann deshalb verwirrend sein.

Das ist das Ergebnis der Zweideutigkeit, der Gebrauch von Synonymen und die Durchführungen, die das ursprüngliche Muster verdunkeln können, indem sie außer ihm gut gegangen wird.

  1. Zweideutigkeit.
  2. Der Begriff Befehl ist zweideutig. Steigen Sie zum Beispiel, steigen Sie kann sich auf eine Single beziehen (bringen) Befehl (heran), der zweimal durchgeführt werden sollte, oder er sich auf zwei Befehle beziehen kann, von denen jeder zufällig dasselbe macht (steigen). Wenn der ehemalige Befehl zweimal zu einem aufmachen Stapel hinzugefügt wird, beziehen sich beide Sachen auf dem Stapel auf dasselbe Befehl-Beispiel. Das kann passend sein, wenn ein Befehl immer derselbe Weg aufgemacht werden kann (z.B steigen herunter). Sowohl die Bande Vier als auch das javanische Beispiel verwenden unten diese Interpretation des Begriffes Befehl. Andererseits, wenn die letzten Befehle zu einem aufmachen Stapel hinzugefügt werden, bezieht sich der Stapel auf zwei getrennte Gegenstände. Das kann passend sein, wenn jeder Gegenstand auf dem Stapel Information enthalten muss, die dem Befehl erlaubt, aufgemacht zu werden. Zum Beispiel, um einen löschen Auswahl-Befehl aufzumachen, kann der Gegenstand eine Kopie des gelöschten Textes enthalten, so dass es wieder eingesetzt werden kann, wenn der löschen Auswahl-Befehl aufgemacht werden muss. Bemerken Sie, dass das Verwenden eines getrennten Gegenstands für jede Beschwörung eines Befehls auch ein Beispiel der Kette des Verantwortungsmusters ist.
  3. Der Begriff führt durch ist auch zweideutig. Es kann sich auf das Laufen des durch den Befehl-Gegenstand identifizierten Codes beziehen führen Methode durch. Jedoch, im Windows-Präsentationsfundament des Microsofts, wie man betrachtet, ist ein Befehl durchgeführt worden, wenn der Befehl Methode durchführt, ist angerufen worden, aber das bedeutet nicht notwendigerweise, dass der Anwendungscode gelaufen ist. Das kommt nur nach etwas weiterer Ereignis-Verarbeitung vor.
  4. Synonyme und Homonyme.
  5. Kunde, Quelle, Invoker: Der Knopf, Werkzeugleiste-Knopf oder Menüpunkt, haben das vom Benutzer gedrückte Tastenkürzel geklickt.
  6. Befehl-Gegenstand, Aufgewühlter Befehl-Gegenstand, Handlungsgegenstand: Ein Singleton-Gegenstand (z.B gibt es nur einen Gegenstand von CopyCommand), der über Tastenkürzel, Knopf-Images, Befehl-Text weiß, der usw. mit dem Befehl verbunden ist. Ein Source/invoker-Gegenstand nennt die execute/performAction Methode des Gegenstands des Befehls/Handlung. Der Gegenstand des Befehls/Handlung gibt die passenden Source/invoker-Gegenstände bekannt, als sich die Verfügbarkeit eines Befehls/Handlung geändert hat. Das erlaubt Knöpfen und Menüpunkten, untätig zu werden (grayed), wenn ein Befehl/Handlung nicht durchgeführt/durchgeführt werden kann.
  7. Empfänger, Zielgegenstand: Der Gegenstand, der im Begriff ist kopiert zu werden, hat bewegt usw. aufgeklebt. Der Empfänger-Gegenstand besitzt die Methode, die durch den Befehl genannt wird, führen Methode durch. Der Empfänger ist normalerweise auch der Zielgegenstand. Zum Beispiel, wenn der Empfänger-Gegenstand ein Cursor ist und die Methode moveUp genannt wird, dann würde man erwarten, dass der Cursor das Ziel der moveUp Handlung ist. Andererseits, wenn der Code durch den Befehl-Gegenstand selbst definiert wird, wird der Zielgegenstand ein verschiedener Gegenstand völlig sein.
  8. Befehl-Gegenstand, aufgewühltes Ereignis args, Ereignis-Gegenstand: Der Gegenstand, der von der Quelle zum Gegenstand des Befehls/Handlung passiert wird, zum Ziel protestiert gegen den Code, der die Arbeit tut. Jeder Knopf-Klick oder Tastenkürzel laufen auf einen neuen Gegenstand des Befehls/Ereignisses hinaus. Einige Durchführungen fügen mehr Information zum Gegenstand des Befehls/Ereignisses hinzu, weil es von einem Gegenstand passiert wird (z.B. CopyCommand) zu einem anderen (z.B Dokumentenabteilung). Andere Durchführungen stellen Gegenstände des Befehls/Ereignisses in anderen Ereignis-Gegenständen (wie ein Kasten innerhalb eines größeren Kastens), weil sie die Linie vorankommen, um zu vermeiden, Konflikte zu nennen. (Siehe auch Kette des Verantwortungsmusters).
  9. Dressierer, ExecutedRoutedEventHandler, Methode, Funktion: Der wirkliche Code, der das Kopieren, Aufkleben, Bewegen usw. tut. In einigen Durchführungen ist der Dressierer-Code ein Teil des Gegenstands des Befehls/Handlung. In anderen Durchführungen ist der Code ein Teil des Gegenstands des Empfängers/Ziels, und in noch anderen Durchführungen wird der Dressierer-Code getrennt von den anderen Gegenständen behalten.
  10. Befehlen Sie Betriebsleiter, Machen Sie Betriebsleiter, Planer, Warteschlange, Fahrdienstleiter, Invoker Auf: Ein Gegenstand, der Gegenstände des Befehls/Ereignisses ein aufmachen Stapel anzieht oder Stapel nochmals tut, oder hält das an Gegenständen des Befehls/Ereignisses fest, bis andere Gegenstände bereit sind, ihnen oder dem Wege zu folgen, die der Befehl/Ereignis gegen den passenden Gegenstand des Empfängers/Ziels oder Dressierer-Code einwendet.
  11. Durchführungen, die außer dem ursprünglichen Befehl-Muster gut gehen.
  12. Windows Presentation Foundation (WPF) des Microsofts, führt aufgewühlte Befehle ein, die das Befehl-Muster mit der Ereignis-Verarbeitung verbinden. Infolgedessen enthält der Befehl-Gegenstand nicht mehr eine Verweisung auf den Zielgegenstand noch eine Verweisung auf den Anwendungscode. Statt dessen führt das Hervorrufen des Befehl-Gegenstands Befehl durch läuft auf ein so genanntes Durchgeführtes Aufgewühltes Ereignis hinaus, das während des tunneling oder des Sprudelns des Ereignisses auf einen so genannten verbindlichen Gegenstand stoßen kann, der das Ziel und den Anwendungscode identifiziert, der an diesem Punkt durchgeführt wird.

Beispiel

Denken Sie einen "einfachen" Schalter. In diesem Beispiel konfigurieren wir den Schalter mit 2 Befehlen: Das Licht einzuschalten und das Licht abzudrehen.

Ein Vorteil dieser besonderen Durchführung des Befehl-Musters ist, dass der Schalter mit jedem Gerät, nicht nur ein Licht verwendet werden kann - schaltet der Schalter im folgenden Beispiel ein Licht und davon ein, aber der Konstrukteur des Schalters ist im Stande, irgendwelche Unterklassen des Befehls für seine 2 Rahmen zu akzeptieren. Zum Beispiel konnten Sie den Schalter konfigurieren, um einen Motor anzufangen.

Zeichen: Eine Kritik der Beispielanwendung besteht unten darin, dass sie keinen elektrischen Stromkreis aufrichtig modelliert. Ein elektrischer Schalter ist stumm. Ein wahrer binärer Schalter weiß nur, dass es entweder auf oder aus ist. Es weiß darüber nicht oder hat jede direkte Beziehung mit den verschiedenen Lasten, die einem Stromkreis beigefügt werden könnten (d. h. Sie einen Schalter zu einem Stromkreis einhacken, nicht direkt zu einer Last). Der Schalter sollte einfach ein Ereignis seines aktuellen Staates (entweder AUF oder VON) veröffentlichen. Der Stromkreis sollte dann einen Staatsmotor enthalten, der Stromkreis-Staaten an verschiedenen Punkten entlang ihm führt (durch das Hören Schalter-Ereignisse), um komplizierte Stromkreise mit vielfachen Lasten und Schaltern richtig zu versorgen. Jede Last ist dann zu einem Staat eines spezifischen Stromkreises (nicht direkt zu jedem spezifischen Schalter) bedingt. Schließlich der Schalter selbst sollte keiner Lampe-Details bewusst sein.

Java

/*the Befehlen Sie interface* /

öffentlicher Schnittstelle-Befehl {\

Leere führt durch;

}\

/*the Invoker class* /

Import java.util. Liste;Import java.util. ArrayList;

öffentlicher Klassenschalter {\

private Liste

öffentlicher Schalter {\

}\

öffentliche Leere storeAndExecute (Befehlen cmd), {\

this.history.add (cmd);//fakultativer

cmd.execute ;

}\}\

/*the Empfänger class* /

öffentliches Klassenlicht {\

öffentliches Licht {\

}\

öffentliche Leere turnOn {\

System.out.println ("Das Licht ist auf");

}\

öffentliche Leere turnOff {\

System.out.println ("Das Licht ist von");

}\}\

/*the Befehl, um - ConcreteCommand #1*/ das Licht einzuschalten

öffentliche Klasse FlipUpCommand führt Befehl {\durch

privates Licht theLight;

öffentlicher FlipUpCommand (Leichtes Licht) {\

this.theLight = Licht;

}\

öffentliche Leere führt {\durch

theLight.turnOn ;

}\}\

/*the Befehl, für das Licht - ConcreteCommand #2*/ abzudrehen

öffentliche Klasse FlipDownCommand führt Befehl {\durch

privates Licht theLight;

öffentlicher FlipDownCommand (Leichtes Licht) {\

this.theLight = Licht; }\

öffentliche Leere führt {\durch

theLight.turnOff ;

}\}\

/*The Testklasse oder client* /

öffentliche Klasse PressSwitch {\

öffentliche statische leere Hauptsache (Schnur [] args) {\

Leichte Lampe = neues Licht ;

Befehlen Sie switchUp = neuer FlipUpCommand (Lampe);

Befehlen Sie switchDown = neuer FlipDownCommand (Lampe);

Schalten Sie s = neuer Schalter ;

versuchen Sie {\

wenn (args [0].equalsIgnoreCase ("AUF")) {\

s.storeAndExecute (switchUp);

System.exit (0);

}\

wenn (args [0].equalsIgnoreCase ("VON")) {\

s.storeAndExecute (switchDown);

System.exit (0); }\

System.out.println ("Argument \"AUF \" oder \"VON \" ist erforderlich.");

} Fang (Ausnahme e) {\

System.out.println ("Argumente erforderlich.");

}\

}\}\</Quelle>

Pythonschlange

Der folgende Code ist eine Durchführung des Befehl-Musters in der Pythonschlange.

Klassenschalter:

" "" Die INVOKER Klasse"""

def __ init __ (selbst, flipUpCmd, flipDownCmd):

self.flipUp, self.flipDown = flipUpCmd, flipDownCmd

Klassenlicht:

" ""Die EMPFÄNGER-Klasse"""

def turnOn (selbst): Druck "Das Licht ist auf"

def turnOff (selbst): Druck "Das Licht ist von"

Klasse LightSwitch:

" "" Die Kundenklasse"""

def __ init __ (selbst):

Lampe = Licht

selbst. __ schalten = Schalter (lamp.turnOn, lamp.turnOff) um

Def-Schalter (selbst, cmd):

cmd = cmd.strip .upper

Versuch:

wenn cmd == "AUF":

selbst. __ switch.flipUp

elif cmd == "VON":

selbst. __ switch.flipDown

sonst:

drucken Sie 'Argument "DARAUF", oder "DAVON" ist erforderlich.'

außer der Ausnahme, msg:

drucken Sie "Vorgekommene Ausnahme: %s" % msg

  1. Führen Sie durch, wenn diese Datei als eine Schrift geführt und als ein Modul nicht importiert wird

wenn __ __ == "__ wichtig __" nennen:

lightSwitch = LightSwitch ;

Druck "Schaltet Test ein."; lightSwitch.switch ("AUF")

Druck "Schaltet Test aus."; lightSwitch.switch ("VON")

drucken Sie "Ungültigen Befehl-Test. "; lightSwitch.switch (" ****")

</Quelle>

Siehe auch

  • Gruppe-Warteschlange
  • Verschluss
  • Befehl-Warteschlange
  • Funktionsgegenstand
  • Job-Planer
  • Muster-Ansicht-Kontrolleur
  • Vorzugswarteschlange
  • Ehrenbürger, E; Sierra, K; Ätzlaugen, B (2004). Führen Sie die ersten Designmuster an. O'Reilly.
  • GoF - Designmuster

Außenverbindungen

http://www.javaworld.com/javaworld/javatips/jw-javatip68.html

Proxymuster / Muster von Iterator
Impressum & Datenschutz