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.
interface CommandInterface { public function execute([options]); public function reverse([options]); }
Nun lassen sich beliebig viele Kommandos des Command-Types erstellen. Für das Beispiel gibt drei Methoden welche eine Installationsroutine vereinfacht abbilden sollen.
LoadFilesCommand
class LoadFilesCommand implements CommandInterface { public function execute() { // Dateien herunterladen } public function reverse() { // Dateien löschen } }
InstallCommand
class InstallCommand implements CommandInterface { public function execute() { // irgendwas installieren } public function reverse() { // irgendwas deinstallieren } }
InstallDbCommand
class InstallDbCommand implements CommandInterface { public function execute() { // Datenbank einspielen } public function reverse() { // Datenbank löschen } }
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.
class Installation { private $_steps = array(); public function addStep(CommandInterface $command) { $this->_steps[] = $command; } public function install() { foreach ($this->_steps as $command) { $command->execute(); } } public function uninstall() { foreach (array_reverse($this->_steps) as $command) { $command->_reverse(); } } }
Die beschriebene Installation als Codebeispiel:
// Installation erstellen $installation = new Installation(); // mit Aufgaben befüllen $installation->addStep(new LoadFilesCommand()); $installation->addStep(new InstallCommand()); $installation->addStep(new InstallDbCommand()); // und ausführen $installation->install(); // und wieder deinstallieren $installation->uninstall();
Das Command Pattern findet zum Beispiel im Composite oder Observer Pattern seinen Einsatz.




Neueste Kommentare
vor 9 Wochen 1 Tag
vor 9 Wochen 1 Tag
vor 16 Wochen 4 Tage
vor 16 Wochen 4 Tage
vor 19 Wochen 6 Tage
vor 20 Wochen 4 Tage
vor 20 Wochen 4 Tage