Я бы посоветовал вам также создать унифицированный интерфейс (или даже абстрактный базовый класс) для декораторов и объектов, которые вы хотите оформить.
Чтобы продолжить приведенный выше пример, у вас может быть что-то вроде:
interface IDecoratedText
{
public function __toString();
}
Затем, конечно, измените оба Text
и LeetText
для реализации интерфейса.
class Text implements IDecoratedText
{
...//same implementation as above
}
class LeetText implements IDecoratedText
{
protected $text;
public function __construct(IDecoratedText $text) {
$this->text = $text;
}
public function __toString() {
return str_replace(array('e', 'i', 'l', 't', 'o'), array(3, 1, 1, 7, 0), $this->text->toString());
}
}
Зачем использовать интерфейс?
Потому что тогда вы можете добавить столько декораторов, сколько захотите, и быть уверенными, что каждый декоратор (или объект, который нужно декорировать) будет иметь все необходимые функции.