Jewiki unterstützen. Jewiki, die größte Online-Enzy­klo­pädie zum Judentum.

Helfen Sie Jewiki mit einer kleinen oder auch größeren Spende. Einmalig oder regelmäßig, damit die Zukunft von Jewiki gesichert bleibt ...

Vielen Dank für Ihr Engagement! (→ Spendenkonten)

How to read Jewiki in your desired language · Comment lire Jewiki dans votre langue préférée · Cómo leer Jewiki en su idioma preferido · בשפה הרצויה Jewiki כיצד לקרוא · Как читать Jewiki на предпочитаемом вами языке · كيف تقرأ Jewiki باللغة التي تريدها · Como ler o Jewiki na sua língua preferida

Kommando (Entwurfsmuster)

Aus Jewiki
Zur Navigation springen Zur Suche springen

In der objektorientierten Programmierung ist Kommando (auch Befehl; englisch command) ein Entwurfsmuster, das zur Kategorie der Verhaltensmuster (englisch behavioral design patterns) gehört. In diesem Entwurfsmuster kapselt das Kommando-Objekt einen Befehl, um es so zu ermöglichen, Operationen in eine Warteschlange zu stellen, Logbucheinträge zu führen und Operationen rückgängig zu machen.[1] Es ist eines der GoF-Muster.

Verwendung

Wenn z. B. eine Schaltfläche in einer grafischen Benutzeroberfläche mit einer Aktion verknüpft werden soll, dient das Kommando dazu, die auszuführende Aktion zu parametrieren. Es stellt somit die objektorientierte Entsprechung zu den Rückruffunktionen (callback function) dar. Dabei können das Erstellen des Kommandos und die tatsächliche Ausführung zu verschiedenen Zeiten oder in einem anderen Kontext (Thread, Prozess, Rechner) stattfinden.

Implementierung eines Rückgängig-Mechanismus (undo): Bei jeder Ausführung werden die zur Umkehrung nötigen Daten im Objekt gespeichert und das Objekt selber auf einem Stapel gesichert. Um das Gegenteil Wiederherstellen (redo) zu implementieren, genügt ein zweiter Stapel für die rückgängig gemachten Befehle.

Akteure

UML-Klassendiagramm

Der Befehl ist die Basisklasse aller Kommandos. Ein konkreter Befehl speichert den zum Ausführen nötigen Zustand, darunter typischerweise auch einen Verweis auf den Empfänger und implementiert die Befehlsschnittstelle.

Der Klient erzeugt einen konkreten Befehl und versieht ihn mit einem Verweis auf den Empfänger und allen anderen nötigen Informationen. Er gibt dem Aufrufer eine Referenz auf den konkreten Befehl.

Der Aufrufer besitzt einen oder mehrere Verweise auf Befehle und fordert diese bei Bedarf auf, ihre Aktion auszuführen. An den Empfänger werden keine besonderen Anforderungen gestellt. Er muss nichts über die anderen Akteure wissen. Somit kann jede Klasse als Empfänger dienen. Der konkrete Befehl ruft Methoden des Empfängerobjektes auf, um seine Aktion auszuführen.

Vor- & Nachteile

Auslösender und Ausführender sind entkoppelt. Befehlsobjekte können wie andere Objekte auch manipuliert werden (Verändern, Filtern, Zwischenspeichern, …). Befehlsobjekte können zu komplexen Befehlen kombiniert werden (Makros, realisiert als Kompositum).

Da für jedes Kommando eine neue Klasse benötigt wird, kann deren Anzahl schnell groß und die Implementierung damit unübersichtlich werden.

Beispiel in PHP

abstract class Kommando {
    abstract function ausfuehren();
}

class Aufrufer {
    private $history = array();

    public function speichernUndAusfuehren(Kommando $cmd) {
        $this->history[] = $cmd; // optional 
        $cmd->ausfuehren();
    }
}
 
// Empfänger
class Licht {
    public function licht_an() {
        write_line('Licht ist an.');
    }
    public function licht_aus() {
        write_line('Licht ist aus.');
    }
}
 
// konkretes Kommando #1: Licht an
class Kommando_An extends Kommando {
    private $dasLicht;
    public function __construct(Licht $licht) {
        $this->dasLicht = $licht;
    }
    public function ausfuehren() {
        $this->dasLicht->licht_an();
    }
}

// konkretes Kommando #2: Licht aus
class Kommando_Aus extends Kommando {
    private $dasLicht;
    public function __construct(Licht $licht) {
        $this->dasLicht = $licht;
    }
    public function ausfuehren() {
        $this->dasLicht->licht_aus();
    }
}

// Der Klient
function Test($kommando_string) {
    $lamp     = new Licht();
    $kmd_an   = new Kommando_An ($lamp);
    $kmd_aus  = new Kommando_Aus($lamp);

    $aufrufer = new Aufrufer();

    switch ($kommando_string) {
        case 'ON':
            $aufrufer->speichernUndAusfuehren($kmd_an);
        break;
        case 'OFF':
            $aufrufer->speichernUndAusfuehren($kmd_aus);
        break;
        default:
            write_line('Nur die Argumente "ON" oder "OFF" sind erlaubt.');
    }
}

function write_line($text) {
    print $text.'<br/>';
}

Test('ON');
Test('OFF');

Ausgabe:

Licht ist an.
Licht ist aus.

Weblinks

 Commons: Kommando (Entwurfsmuster) – Sammlung von Bildern, Videos und Audiodateien
Wikibooks Wikibooks: Muster: Command – Lern- und Lehrmaterialien

Einzelnachweise

  1. Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides: Entwurfsmuster. 5 Auflage. Addison-Wesley, 1996, ISBN 3-8273-1862-9, S. 287.
Dieser Artikel basiert ursprünglich auf dem Artikel Kommando (Entwurfsmuster) aus der freien Enzyklopädie Wikipedia und steht unter der Doppellizenz GNU-Lizenz für freie Dokumentation und Creative Commons CC-BY-SA 3.0 Unported. In der Wikipedia ist eine Liste der ursprünglichen Wikipedia-Autoren verfügbar.