Heim  >  Artikel  >  Java  >  Beispielerklärung eines Befehlsmusters in Java-Entwurfsmustern

Beispielerklärung eines Befehlsmusters in Java-Entwurfsmustern

黄舟
黄舟Original
2017-08-10 09:58:221595Durchsuche

Befehlsmuster ist die Kapselung von Befehlen. Nachfolgend wird die Grundstruktur des Befehlsmusterklassendiagramms vorgestellt >Definition: Kapselt eine Anforderung in ein Objekt, sodass Sie den Client mit verschiedenen Anforderungen parametrisieren, Anforderungen in die Warteschlange stellen oder Anforderungsprotokolle aufzeichnen sowie Funktionen zum Rückgängigmachen und Wiederherstellen von Befehlen bereitstellen können.

Typ: Verhaltensklassenmuster

Klassendiagramm:

Befehlsmusterstruktur Wie der Name schon sagt, ist das Befehlsmuster eine Kapselung von Befehlen. Schauen wir uns zunächst die Grundstruktur im Befehlsmuster-Klassendiagramm an:

     Befehlsklasse: Es handelt sich um eine abstrakte Klasse. Die Klasse deklariert den auszuführenden Befehl. Im Allgemeinen muss eine Ausführungsmethode veröffentlicht werden, um den Befehl auszuführen.
  • ConcreteCommand-Klasse: Die Implementierungsklasse der Command-Klasse, die die in der abstrakten Klasse deklarierten Methoden implementiert.
  •  Client-Klasse: Die letzte Client-Aufrufklasse.
  • Die Funktionen der oben genannten drei Klassen sollten relativ einfach zu verstehen sein. Konzentrieren wir uns auf die Invoker-Klasse und die Recevier-Klasse.

    Invoker-Klasse: Aufrufer, verantwortlich für das Aufrufen von Befehlen.
  • Empfängerklasse: Empfänger, verantwortlich für den Empfang von Befehlen und deren Ausführung.
  • Die sogenannte Kapselung von Befehlen ist, um es ganz klar auszudrücken, nichts anderes, als eine Reihe von Operationen in eine Methode zu schreiben und sie dann vom Client aufzurufen Klassendiagramm, nur Eine ConcreteCommand-Klasse und eine Client-Klasse können die Kapselung von Befehlen vervollständigen. Um die Flexibilität zu erhöhen, können Sie eine Befehlsklasse für eine entsprechende Abstraktion hinzufügen.

Eigentlich kann man es aus einem anderen Blickwinkel betrachten: Wenn Sie einige Operationen einfach als Befehl kapseln, damit andere sie aufrufen können, wie kann man das dann als Muster bezeichnen? Als Verhaltensmuster muss das Befehlsmuster zunächst eine geringe Kopplung erreichen. Eine geringe Kopplung kann die Flexibilität verbessern, und genau diesem Zweck dient das Hinzufügen der beiden Rollen Anrufer und Empfänger. Der allgemeine

-Code für den Befehlsmodus lautet wie folgt:



Wir können anhand des Codes erkennen, dass bei unserem Aufruf die Ausführungssequenz zuerst die Aufruferklasse ist , und dann ist die Befehlsklasse und schließlich die Empfängerklasse. Mit anderen Worten, die Ausführung eines Befehls ist in drei Schritte unterteilt, und der Kopplungsgrad ist viel geringer als bei der Kapselung aller Operationen in einer Klasse. Dies ist die Essenz des Befehlsmusters: Der Aufrufer des Befehls wird vom Ausführer getrennt Keine der Parteien muss sich darum kümmern, wie die andere Partei vorgeht.
class Invoker { 
 private Command command; 
 public void setCommand(Command command) { 
  this.command = command; 
 } 
 public void action(){ 
  this.command.execute(); 
 } 
} 
abstract class Command { 
 public abstract void execute(); 
} 
class ConcreteCommand extends Command { 
 private Receiver receiver; 
 public ConcreteCommand(Receiver receiver){ 
  this.receiver = receiver; 
 } 
 public void execute() { 
  this.receiver.doSomething(); 
 } 
} 
class Receiver { 
 public void doSomething(){ 
  System.out.println("接受者-业务逻辑处理"); 
 } 
} 
public class Client { 
 public static void main(String[] args){ 
  Receiver receiver = new Receiver(); 
  Command command = new ConcreteCommand(receiver); 
  //客户端直接执行具体命令方式(此方式与类图相符) 
  command.execute(); 
 
  //客户端通过调用者来执行命令 
  Invoker invoker = new Invoker(); 
  invoker.setCommand(command); 
  invoker.action(); 
 } 
}


Vor- und Nachteile des Befehlsmodus Erstens verfügt der Befehlsmodus über eine gute Kapselung: Jeder Befehl ist für den Client gekapselt , kann es den entsprechenden Befehl aufrufen, wenn es eine Funktion benötigt, ohne zu wissen, wie der Befehl ausgeführt wird. Beispielsweise gibt es eine Reihe von Dateioperationsbefehlen: Neue Dateien erstellen, Dateien kopieren und Dateien löschen. Wenn diese drei Operationen in einer Befehlsklasse gekapselt sind, muss der Client nur wissen, dass es diese drei Befehlsklassen gibt. Was die in der Befehlsklasse gekapselte Logik betrifft, muss der Client dies nicht wissen.

Zweitens ist die Skalierbarkeit des Befehlsmodus sehr gut. Im Befehlsmodus werden die grundlegendsten Operationen im Allgemeinen in der Empfängerklasse gekapselt, und die Befehlsklasse führt beim Hinzufügen von a eine sekundäre Kapselung durch Bei einem neuen Befehl beginnt das Schreiben der Befehlsklasse im Allgemeinen nicht bei Null. Es gibt eine große Anzahl aufzurufender Empfängerklassen und eine große Anzahl aufzurufender Befehlsklassen. Die Wiederverwendbarkeit des Codes ist sehr gut. Wenn wir beispielsweise einen Befehl zum Ausschneiden von Dateien während Dateivorgängen hinzufügen müssen, müssen wir nur die beiden Befehle zum Kopieren von Dateien und Löschen von Dateien kombinieren, was sehr praktisch ist.


Lassen Sie uns abschließend über die Mängel des Befehlsmodus sprechen, das heißt, wenn es viele Befehle gibt, wird die Entwicklung Kopfschmerzen bereiten. Insbesondere können viele einfache Befehle mit nur wenigen Codezeilen implementiert werden. Wenn Sie den Befehlsmodus verwenden, müssen Sie, egal wie einfach der Befehl ist, eine Befehlsklasse schreiben, um ihn zu kapseln.


Anwendbare Szenarien des Befehlsmodus Für die meisten Funktionen im Anforderungs-Antwort-Modus ist es besser, einfach den Befehlsmodus zu verwenden like command Wie die Modusdefinition besagt, ist der Befehlsmodus praktischer für die Implementierung von Funktionen wie Protokollierung und Rückgängigmachen von Vorgängen.


Zusammenfassung

Letztlich ist es für alle Entwickler ein sehr verwirrendes Thema. Da einige Änderungen in der Nachfrage vorhersehbar sind, wird ein bestimmtes Entwurfsmuster für die Flexibilität und Skalierbarkeit des Systems verwendet, aber die vorhergesehene Nachfrage tritt nicht ein. Im Gegenteil, die unvorhergesehene Nachfrage tritt häufig auf. Die verwendeten Entwurfsmuster hatten den gegenteiligen Effekt und führten zu Beschwerden beim gesamten Projektteam. Ich glaube, jeder Programmierer ist auf ein solches Beispiel gestoßen. Basierend auf den Prinzipien der agilen Entwicklung sollten wir daher beim Entwerfen eines Programms, wenn es gut gelöst werden kann, ohne ein bestimmtes Muster gemäß den aktuellen Anforderungen zu verwenden, es nicht einführen, da es nicht schwierig ist, ein Entwurfsmuster einzuführen . können wir das System überarbeiten und dieses Designmuster einführen, wenn wir es wirklich brauchen.

Nehmen Sie den Befehlsmodus als Beispiel. In unserer Entwicklung ist die Funktion „Anfrage-Antwort“ im Allgemeinen sehr verbreitet können Befehle genannt werden, sind aber keine Befehlsmuster. Ob dieses Design auf die Ebene eines Musters angehoben werden sollte oder nicht, muss separat geprüft werden, da bei Verwendung des Befehlsmusters die beiden Rollen des Anrufers und des Empfängers eingeführt werden und die ursprünglich an einer Stelle platzierte Logik aufgelöst wird In drei Klassen muss man bei der Gestaltung abwägen, ob sich die Kosten lohnen.

Das obige ist der detaillierte Inhalt vonBeispielerklärung eines Befehlsmusters in Java-Entwurfsmustern. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn