Это (своего рода) правильная реализация шаблона Decorator?
Да
Если да, можно ли это улучшить и как? Или, может быть, это будет более подходящим для другого шаблона?
Хорошо, вы реализовали Pattern Decorator. Я не могу представить, что может быть лучшим шаблоном, чем шаблон декоратора, если вы хотите его реализовать.
Обычно можно использовать Decorator для реализации интерфейса и замены только части оригинального объекта и передачи остальных. Это сильно зависит от использования объекта. Поскольку в вашем коде показано только то, как реализовать шаблон, но не использование объектов, на него не может быть конкретного ответа, если этот шаблон соответствует вашим потребностям.
Таким образом, вы можете реализовать и другие шаблоны, а затем решить, какой из них лучше. Суть шаблонов: только если вы знаете, что существует, вы можете использовать их.
Итак, рядом с шаблонами и решением о том, какой из них выбрать, часто стоит OOAD . Если вы новичок в этом, закажите эту прекрасную книгу .
О вашем коде
Я впервые ответил «да», когда вы спросили, правильно ли это или нет. В некотором смысле это правильно, но эта часть выглядит неправильно для меня с второго взгляда:
class BeforeTitle extends TitleDecorator {
public function getTitle() {
return 'Welcome to '.$this->getTitle();
}
}
Это неправильно, потому что метод получения в классе BeforeTitle
вызывает себя рекурсивно (он вызывает себя снова и снова и снова ...). Я думаю, что это не предназначено для вас.
Вы делаете это правильно в другом классе декоратора, ссылаясь на $this->_title
, который является экземпляром объекта, который декорируется:
class AfterTitle extends TitleDecorator {
public function getTitle() {
return $this->_title->getTitle().', Dear user!';
}
}
Вы можете использовать шаблон Decorator, если вы хотите заменить / расширить поведение объектов, но вы хотите сделать это без необходимости полностью переписывать функциональность объектов в целом. Но другие могут описать это лучше, чем я.