Command Pattern

Your rating: None Average: 3.7 (3 votes)

Um Methoden nicht fest an eine Klasse zu binden, so dass diese zum Beispiel zur Laufzeit geholt oder ausgetauscht werden können, eignet sich das Command Pattern. Eine Aufgabe wird in einem Objekt gekapselt, um diese als Parameter zu übergeben oder in einer Queue zu registrieren.

CommandInterface

Ein einfaches Interface, welches die einzige sichtbare Methode eines Kommandos enthält. Der Platzhalter [options] symbolisiert die beliebigen Parameter für diesen Command-Typ. Das Beispiel enthält eine weitere Methode reverse() welche eine gegenteilige Aktion zu execute() ausführen soll. Dazu gleich mehr.

  1. interface CommandInterface {
  2.  
  3. public function execute([options]);
  4.  
  5. public function reverse([options]);
  6. }

Nun lassen sich beliebig viele Kommandos des Command-Types erstellen. Für das Beispiel gibt drei Methoden welche eine Installationsroutine vereinfacht abbilden sollen.

LoadFilesCommand

  1. class LoadFilesCommand implements CommandInterface {
  2.  
  3. public function execute() {
  4. // Dateien herunterladen
  5. }
  6.  
  7. public function reverse() {
  8. // Dateien löschen
  9. }
  10. }

InstallCommand

  1. class InstallCommand implements CommandInterface {
  2.  
  3. public function execute() {
  4. // irgendwas installieren
  5. }
  6.  
  7. public function reverse() {
  8. // irgendwas deinstallieren
  9. }
  10. }

InstallDbCommand

  1. class InstallDbCommand implements CommandInterface {
  2.  
  3. public function execute() {
  4. // Datenbank einspielen
  5. }
  6.  
  7. public function reverse() {
  8. // Datenbank löschen
  9. }
  10. }

Installation

Diese Klasse bildet die vereinfachte Installationsroutine ab. Die Methode addStep() fügt dieser die einzelnen Schritte hinzu. Der Aufruf von install() durchläuft die registrierten Schritte der Installation. Da jeder Schritt auch die Möglichkeit bietet seine Änderung obsolet zu machen, wurde eine Methode uninstall() implementiert, welche in umgekehrter Reihenfolge die Schritte durchläuft und somit die Installation rückgängig macht.

  1. class Installation {
  2.  
  3. private $_steps = array();
  4.  
  5. public function addStep(CommandInterface $command) {
  6. $this->_steps[] = $command;
  7. }
  8.  
  9. public function install() {
  10. foreach ($this->_steps as $command) {
  11. $command->execute();
  12. }
  13. }
  14.  
  15. public function uninstall() {
  16. foreach (array_reverse($this->_steps) as $command) {
  17. $command->_reverse();
  18. }
  19. }
  20. }

Die beschriebene Installation als Codebeispiel:

  1. // Installation erstellen
  2. $installation = new Installation();
  3.  
  4. // mit Aufgaben befüllen
  5. $installation->addStep(new LoadFilesCommand());
  6. $installation->addStep(new InstallCommand());
  7. $installation->addStep(new InstallDbCommand());
  8.  
  9. // und ausführen
  10. $installation->install();
  11.  
  12. // und wieder deinstallieren
  13. $installation->uninstall();

Das Command Pattern findet zum Beispiel im Composite oder Observer Pattern seinen Einsatz.

Post new comment

The content of this field is kept private and will not be shown publicly.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <abbr>
  • Lines and paragraphs break automatically.

More information about formatting options

CAPTCHA
This question is for testing whether you are a human visitor and to prevent automated spam submissions.
Image CAPTCHA
Enter the characters shown in the image.

Tags