Intereting Posts
Доктрина MongoDB найти по id Преобразование строк Mongodb на сегодняшний день Хорошая таблица php print_r Дерево FuelUX: как установить источник данных с источником json? Подавить предупреждение о неоднозначности класса для композитора dump-autoload -o Imagick: UnableToLoadModule Любой надежный API, доступный для определения города и страны пользователя с IP-адреса рекомендации для системы проверки подлинности php Как написать задание Cron для выполнения простого скрипта php? как получить значение cookie php Как включить разрешение разрешения в require_once? Как я могу запретить пользователям доступ к файлам include? Защищенный метод для хранения / получения секретного ключа PGP и кодовой фразы? PHP – это возможность конвертировать массив в vars и передавать их где-нибудь Регулярное выражение соответствует словам или фразам в строке, но НЕ совпадает с частью URL или внутри тегов <a> </a>. (РНР)

Попытка реализовать (понять) шаблон Decorator в php

Я пытаюсь понять шаблон 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; } } 

Если вам нужен более подробный пример реального мира, см. Ссылку здесь .