Преимущество динамического декорирования над статическим — это отсутствие необходимости создания специальных классов декораторов. В данном случае все что нужно для того чтобы PHP класс мог быть декорируемым — это использовать соотвествующую примесь.
В английской статье Википедии про декоратор (ссылка выше) есть Java пример использования статического декорирования в реализации оконного интейрфеса. По аналогии того примера, но без использования классов декораторов:
class Window { use TDecorator; private $title; function __construct($title) { $this->title = $title; } function draw() { // Draws window below // ... // Draws decorations. $this->renderDecoration('draw'); } } class VerticalScrollbar { use TDecoration; private $vWidth; private $vHeight; function __construct($width, $height) { $this->vWidth = $width; $this->vHeight = $height; } function draw() { echo 'Drawing vertical scrollbar for the window "' . $this->title . "\"\n"; echo 'Width: ' . $this->vWidth . "px\n"; echo 'Height: ' . $this->vHeight . "px\n"; } } // Decorates window with a vertical scrollbar. $wnd = new Window('My application'); $wnd->decorateWithObject(new VerticalScrollbar(20, 20)); $wnd->draw();
При декорировании одного объекта другим он получает доступ не только ко всем его публичным и частным методам, но так же и свойствам вместе с их значениями. Можно сказать что таким способом класс VerticalScrollbar наследовал класс Window, но только для одного объекта.
Помимо декорирования одного объекта другим есть и более простая возможно добавлять новое поведение:
class Integer { use TDecorator; protected $value; function __construct($value) { $this->value = intval($value); } } $integer = new Integer(9); $integer->decorateWith('isOdd', function() { return (boolean) ($this->value % 2); }); echo $integer->isOdd(); // echoes true
Реализацию декоратора в виде примеси можно найти здесь.
Надеюсь это небольшая статья кому-нибудь окажется полезной.
ссылка на оригинал статьи http://habrahabr.ru/post/166237/
Добавить комментарий