Cytat
Wszystko zależy do tego w jakiej kolejności utworzy się instancje (patrz kod wyżej).
To nie jest do końca prawdą. Nie mówię o wywołaniu metod, tylko wykonaniu czynności filtrów, a to jest duża różnica. Oto prosty przykład.
<?php
abstract class Decorator {
public function __construct($nextDecorator = null) {
if (!empty($nextDecorator) && $nextDecorator instanceof Decorator
) { $this->next = $nextDecorator;
}
}
abstract public function dosmth($param);
protected $next;
}
class Decorator1 extends Decorator {
public function __construct($nextDecorator = null) {
parent::__construct($nextDecorator);
}
public function dosmth($param) {
if (!empty($this->next)) { $this->next->dosmth($param);
}
}
}
class Decorator2 extends Decorator {
public function __construct($nextDecorator = null) {
parent::__construct($nextDecorator);
}
public function dosmth($param) {
if (!empty($this->next)) { $this->next->dosmth($param);
}
}
}
class Decorator3 extends Decorator {
public function __construct($nextDecorator = null) {
parent::__construct($nextDecorator);
}
public function dosmth($param) {
if (!empty($this->next)) { $this->next->dosmth($param);
}
}
}
$d = new Decorator1(new Decorator2(new Decorator3()));
$d->dosmth('');
?>
Niestety dekorator wymaga trzymania porządku w kodzie i pozwala na takie przekłamania...