Technischer Projektleiter
Java-Entwurfsmuster (design patterns): Command
Heute werfen wir einen Blick auf das nächste Entwurfsmuster (Java design patterns) aus der Kategorie der Verhaltensmuster (Behavioral Patterns) – Command. Entwurfsmuster in dieser Kategorie befassen sich mit der Kommunikation (interaction) zwischen Objekten und ihrer Verantwortung (responsibility).
Was ist das Entwurfsmuster Command ?
Command ist ein Entwurfsmuster, das Anforderungen oder Operationen zusammen mit den Informationen zu deren Ausführung in separate Objekte verpackt. Diese Informationen umfassen meist den Methodennamen des entsprechenden Objekts sowie die Methodenparameter. Mit dem Muster sind immer die Begriffe Client (Klient), Command (Befehl), Receiver (Empfänger) und Invoker (Auslöser) verbunden. Der Kunde entscheidet, welcher Auftrag zu welchem Zeitpunkt ausgeführt wird. Um den Befehl auszuführen, verschiebt er das Befehlsobjekt des aufrufenden Objekts. Der Aufforderer weiß nichts über ein bestimmtes Objekt, er kennt nur seine Schnittstelle. Seine Aufgabe ist es, den Befehl durch Aufruf der Methode Execute auszuführen und ggf. die Details der aufgerufenen Operation zu speichern. Der Empfänger führt den Auftrag dann über das Befehlsobjekt aus.
Welches Problem wird durch das Entwurfsmuster Command gelöst?
Es löst das Problem der Trennung zwischen dem Objekt, das eine Operation aufruft (dem Aufrufer) und dem Objekt, das diese Operation ausführt (dem Empfänger). Das Hauptziel besteht darin, eine flexible Verbindung zwischen den Objekten zu schaffen, die Anfragen auslösen, und denen, die sie verarbeiten. Diese Objekte enthalten alle Informationen, die für die Durchführung eines bestimmten Vorgangs im Hintergrund erforderlich sind. Auf diese Weise ist es möglich, Client-Anfragen mit unterschiedlichen Parametern zu bearbeiten. Anfragen können zur Bearbeitung in eine Warteschlange gestellt, protokolliert oder sogar umgekehrte Operationen durchgeführt werden.
Beispiel für die Implementierung eines Befehls in Java
Das Entwurfsmuster ist etwas komplizierter zu verstehen, daher habe ich ein Beispiel vorbereitet, in dem wir die Rollen Client, Command, Receiver und Invoker näher erläutern werden. Wir werden ein einfaches Programm schreiben, das die Taschenlampe über Befehle steuern wird. Prikaz.java
package designpatterns;
// Command rozhranie
public interface Prikaz {
void vykonat();
}
Die Schnittstelle Prikaz definiert die Operation vykonaj(), die von allen konkreten Befehlen implementiert wird. ZapnutSvetlo.java
package designpatterns;
// Konkrétny príkaz
public class ZapnutSvetlo implements Prikaz {
private Baterka baterka;
public ZapnutSvetlo(Baterka baterka) {
this.baterka = baterka;
}
@Override
public void vykonat() {
baterka.zapnut();
}
}
VypnutSvetlo.java
package designpatterns;
// Konkrétny príkaz
public class VypnutSvetlo implements Prikaz {
private Baterka baterka;
public VypnutSvetlo(Baterka baterka) {
this.baterka = baterka;
}
@Override
public void vykonat() {
baterka.vypnut();
}
}
Insbesondere die Befehle ZapnutSvetlostrong und VypnutSvetlo implementieren die Schnittstelle Prikazstrong und enthalten einen Verweis auf ein bestimmtes Baterka, das die entsprechende Operation ausführt. Baterka.java
package designpatterns;
// Receiver
public class Baterka {
public void zapnut() {
System.out.println("Baterka svieti");
}
public void vypnut() {
System.out.println("Baterka je vypnuta");
}
}
Die Klasse Baterka stellt einen Receiver dar und enthält die Methoden, die bei der Ausführung der Befehle aufgerufen werden. Vypinac.java
package designpatterns;
// Invoker
public class Vypinac {
private Prikaz prikaz;
public void nastavPrikaz(Prikaz prikaz) {
this.prikaz = prikaz;
}
public void stlacitTlacidlo() {
prikaz.vykonat();
}
}
Klasse Vypinac stellt einen Invoker dar und enthält einen Verweis auf ein Objekt vom Typ Command und verfügt über eine Methode stlacitTlacidlo(), die die Operation vykonat() des entsprechenden Befehls aufruft. Main.java
import designpatterns.*;
// Klient
public class Main {
public static void main(String[] args) {
// Receiver
Baterka baterka = new Baterka();
// Command(s)
Prikaz zapnutSvetlo = new ZapnutSvetlo(baterka);
Prikaz vypnutSvetlo = new VypnutSvetlo(baterka);
// Invoker
Vypinac vypinac = new Vypinac();
// Nastavenie a spustenie príkazu.
vypinac.nastavPrikaz(zapnutSvetlo);
vypinac.stlacitTlacidlo();
// Nastavenie a spustenie iného príkazu.
vypinac.nastavPrikaz(vypnutSvetlo);
vypinac.stlacitTlacidlo();
}
}
Die Klasse Main stellt den Client dar. In der Hauptmethode erstellen wir Befehle zur Steuerung der Taschenlampe und verknüpfen sie mit dem Empfänger, der sie verarbeiten wird. Wir werden auch ein Invoker-Objekt erstellen – einen Schalter, über den der Client einen bestimmten Befehl setzt, der nach dem Aufruf der Methode stacitTlacidlo() ausgeführt wird. Einfach ausgedrückt: Der Client sendet Befehle an den Schalter, der die Taschenlampe steuert. Die Ausgabe dieses Beispiels ist:
Zusammenfassung
Das Entwurfsmuster Command wird häufig verwendet, wenn wir die Abhängigkeit einer Anfrage mit einer direkten konkreten Implementierung loswerden müssen. Es hat eine breite Palette von Anwendungen in der grafischen Benutzeroberfläche, Netzwerkkommunikation, Datenbanktransaktionen, etc. Wir haben für dich die Dateien mit dem erwähnten Beispiel in Form von Code vorbereitet, den du direkt in Java ausführen kannst. Lade den Code Java Command hier herunter. Wenn du Java-Programmierer bist und nach einem Job suchst, schau dir unsere Mitarbeiterbenefits an und reagiere auf unsere aktuellen Stellenangebote.