Я пытаюсь понять шаблон Decorator, и я прочитал другие связанные вопросы о SO, тогда я решил попробовать это с тривиальным примером (я начинаю PHP):
interface iTitle { public function getTitle(); } class Title implements iTitle { protected $_text; public function __construct() { $this->_text='Our page'; } public function getTitle() { return $this->_text; } } abstract class TitleDecorator implements iTitle { protected $_title; public function __construct(iTitle $title) { $this->_title=$title; } } class BeforeTitle extends TitleDecorator { public function getTitle() { return 'Welcome to '.$this->_title->getTitle(); } } class AfterTitle extends TitleDecorator { public function getTitle() { return $this->_title->getTitle().', Dear user!'; } }
Является ли это (вид) правильной реализации шаблона Decorator? Если нет, каков будет правильный путь? Если да, можно ли это улучшить и как? Или, может быть, это было бы более подходящим для другого шаблона?
Любая помощь / идеи будут оценены, спасибо заранее!
Является ли это (вид) правильной реализации шаблона Decorator?
да
Если да, можно ли это улучшить и как? Или, может быть, это было бы более подходящим для другого шаблона?
Ну, вы реализовали шаблон Decorator. Я не могу представить, что может быть лучшим шаблоном, чем шаблон декоратора, когда вы хотите его реализовать.
Обычно можно использовать Decorator для реализации интерфейса и заменять только часть объекта оригиналов и передавать остальные. Это сильно зависит от использования объекта. Поскольку ваш код показывает только, как реализовать шаблон, но не использовать объекты, на него не может быть дан конкретный ответ, если этот шаблон соответствует вашим потребностям.
Таким образом, вы также можете реализовать другие шаблоны, а затем решить, какой из них лучше. Суть с шаблонами: только если вы знаете, что существует, вы можете использовать их.
Итак, рядом с шаблонами и решением, которое выбрать там часто, является OOAD . Если вы новичок в этом, посмотрите эту хорошую книгу .
Сначала я ответил «да», когда вы спросили, правильно это или нет. Вид это правильно, но эта часть выглядит неправильно для меня на второй взгляд:
class BeforeTitle extends TitleDecorator { public function getTitle() { return 'Welcome to '.$this->getTitle(); } }
Это неправильно, потому что getter в классе BeforeTitle
называет себя рекурсивно (он вызывает себя снова и снова и снова …). Я думаю, это не предназначено для вас.
Вы делаете это правильно в другом классе декоратора, ссылаясь на $this->_title
который является экземпляром объекта, который оформляется:
class AfterTitle extends TitleDecorator { public function getTitle() { return $this->_title->getTitle().', Dear user!'; } }
Вы можете использовать шаблон Decorator, если хотите заменить / расширить поведение объектов, но вы хотите сделать это без необходимости полностью переписать функциональность объектов в целом. Но другие могут описать это лучше, чем я.
В обработчике декоратора вы всегда должны вводить значение, а не инициализировать внутри конструктора. Пример. Это неверный путь.
class Title implements iTitle { protected $_text; public function __construct() { $this->_text='Our page'; } public function getTitle() { return $this->_text; } }
Это правильный способ:
class Title implements iTitle { protected $_text; public function __construct($text) { $this->_text=$text; } public function getTitle() { return $this->_text; } }
Если вам нужен более подробный пример реального мира, см. Ссылку здесь .