Command

Wenn Methoden nicht fest an eine Klasse gebunden, sondern erst zur Laufzeit geholt oder sogar ausgetauscht werden sollen, dann eignet sich dafür das Command Pattern. Durch die Übergabe der Objekte im Command an ein Array wird es oft auch als Erweiterung des Composite-Pattern beschrieben. Wie man gut in diesem und diesem Artikel sehen kann, wird es oft für z.B. Installationsscripte eingesetzt. Mein Beispiel ist an das Kapitel 5 von "PHP Design Pattern" angelehnt - es ist übrigens jeden Cent wert :)

class Auto {
    protected $hersteller;
    protected $farbe;

    public function __construct($hersteller, $farbe) {
        $this->hersteller = $hersteller;
        $this->farbe = $farbe;
    }

    public function hersteller() {
        return $this->hersteller;
    }

    public function farbe() {
        return $this->farbe;
    }
}

class WaschCommand {
    protected $programmes = array();

    public function addProgramme($name, $commands) {
        $this->programmes[$name] = $commands;
    }

    public function wash($programme, Auto $auto) {
        print "\nDas Waschprogramm {$programme} wird gestartet.\n\n";
        foreach ($this->programmes[$programme] as $command) {
            $command->execute($auto);
        }
    }
}

interface CommandInterface {
	public function execute(Auto $auto);
}

class VorWaescheCommand implements CommandInterface  {
    public function execute(Auto $auto) {
        printf("Das Auto %s wird vorgewaschen.\n", $auto->hersteller());
    }
}

class EinfachWaescheCommand implements CommandInterface  {
    public function execute(Auto $auto) {
        printf("Das Auto %s wird gewaschen.\n", $auto->hersteller());
    }
}

class MotorWaescheCommand implements CommandInterface  {
    public function execute(Auto $auto) {
        printf("Das Auto %s bekommt eine Motorwaesche.\n", $auto->hersteller());
    }
}

class TrocknerCommand implements CommandInterface   {
    public function execute(Auto $auto) {
        printf("Das Auto %s wird getrocknet.\n", $auto->hersteller());
    }
}

$autowaesche = new WaschCommand();

$autowaesche->addProgramme('Standard',
                        array(
                          new EinfachWaescheCommand()
                        )
                      );
$autowaesche->addProgramme('Komfort',
                        array(
                          new VorWaescheCommand(),
                          new MotorWaescheCommand(),
                          new TrocknerCommand()
                        )
                      );

$autowaesche->wash('Standard',	new Auto('Trabant', 'grau'));
$autowaesche->wash('Komfort', 	new Auto('BMW', 'blau'));

// Das Waschprogramm Standard wird gestartet.

// Das Auto Trabant wird gewaschen.

// Das Waschprogramm Komfort wird gestartet.

// Das Auto BMW wird vorgewaschen.
// Das Auto BMW bekommt eine Motorwaesche.
// Das Auto BMW wird getrocknet.

Kommentare