Command Pattern

  • warning: array_fill(): Number of elements must be positive in /var/www/vhosts/benjaminradtke.com/httpdocs/includes/database.inc on line 253.
  • warning: implode(): Invalid arguments passed in /var/www/vhosts/benjaminradtke.com/httpdocs/includes/database.inc on line 253.
  • warning: array_keys() expects parameter 1 to be array, null given in /var/www/vhosts/benjaminradtke.com/httpdocs/modules/user/user.module on line 528.
  • user warning: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1 query: SELECT p.perm FROM role r INNER JOIN permission p ON p.rid = r.rid WHERE r.rid IN () in /var/www/vhosts/benjaminradtke.com/httpdocs/modules/user/user.module on line 528.
No votes yet

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.

Tags