Дисциплины - Объектно-ориентированное программирование

Шаблоны проектирования практических задач - Структурные шаблоны проектирования - Декоратор

Декоратор (англ. Decorator) — структурный шаблон проектирования, предназначенный для динамического подключения дополнительного поведения к объекту. Шаблон Декоратор предоставляет гибкую альтернативу практике создания подклассов с целью расширения функциональности.

PHP

Пример на PHP

abstract class AbstractComponent
{
    abstract public function operation();
}
 
class ConcreteComponent extends AbstractComponent
{
    public function operation() 
    {
        // ...
    }
}
 
abstract class AbstractDecorator extends AbstractComponent
{
    protected $component;
   
    public function __construct(AbstractComponent $component) 
    {
        $this->component = $component;
    }
}
 
class ConcreteDecorator extends AbstractDecorator
{
    public function operation()
    {
        // ... расширенная функциональность ...       
        $this->component->operation();       
        // ... расширенная функциональность ...
    }
}
 
$decoratedComponent = new ConcreteDecorator(
    new ConcreteComponent()
);
 
$decoratedComponent->operation();

Пример на PHP с использованием интерфейсов

interface IText
{
    public function show();
}

class TextHello implements  IText
{
    protected $object;

    public function __construct(IText $text) {
        $this->object = $text;
    }

    public function show() {
        echo 'Hello';
        $this->object->show();
    }
}

class TextWorld implements  IText
{
    protected $object;

    public function __construct(IText $text) {
        $this->object = $text;
    }

    public function show() {
        echo 'world';
        $this->object->show();
    }
}

class TextSpace implements  IText
{
    protected $object;

    public function __construct(IText $text) {
        $this->object = $text;
    }

    public function show() {
        echo ' ';
        $this->object->show();
    }
}

class TextEmpty implements IText
{
    public function show() {
    }
}

$decorator = new TextHello(new TextSpace(new TextWorld(new TextEmpty())));
$decorator->show(); // Hello world
echo '
' . PHP_EOL;
$decorator = new TextWorld(new TextSpace(new TextHello(new TextEmpty())));
$decorator->show(); // world Hello

Python

Декораторы в Python предназначены для модификации функций при помощи самих функций. Они используются, когда необходимо изменить поведение функции без изменения кода. Пример.

def decor(func):
 def wrap():
   print("before")
   func();
   print("after");
 return wrap

deff print_text():
  print("Hello world!")

deco = decor(print_text)
deco()

В данном примере определена функция с именем decor, у которой имеется единственный параметр func. Внутри функции decor определена вложенная фуннкция wrap. Функция wrap выведет строку, затем выполнит функцию, затем выведет еще одну строку. Функция decor возвращает функцию wrap.

В примере дальше определена еще одна функция и переменная. Можно сказать, что переменная deco - это декарированная версия функции print_text.

Python предоставляет удобный способ обернуть любую функую в декоратор; для этого нужно поставить перед определением функции имя декоратора и символ @.

@decor
def print_text():
  print("Hello world!")

Количество комментариев: 0

Для того, чтобы оставить коментарий необходимо зарегистрироваться
814301 БГУИР
814302 БГУИР
814303 БГУИР
894351 БГУИР
90421 БГУИР


Изображения Видео

1. Абстрактная фабрика https://www.youtube.com/watch?v=1mVONOCxfLg
2. Фабричный метод https://www.youtube.com/watch?v=5UqUDR6_2cY
3. Шаблон декоратор https://www.youtube.com/watch?v=Lwb9bm8yKD0
4. Dessign patterns on PHP https://github.com/domnikl/DesignPatternsPHP
5. Приёмы объектно-ориентированного проектирования. Паттерны проектирования Э. Гамма, Р. Хелм, Р. Джонсон, Д. Влиссидес; [пер. с англ.: А. Слинкин науч. ред.: Н. Шалаев]. — Санкт-Петербург [и др.] : Питер, 2014. — 366 с. : ил. ; 24 см.
6. Приемы объектно-ориентированного проектирования. Паттерны проектирования Э. Гамма, Р. Хелм, Р. Джонсон, Д. Влиссидес; [пер. с англ.: А. Слинкин науч. ред.: Н. Шалаев]. — Санкт-Петербург [и др.] : Питер, 2014. — 366 с. : ил. ; 24 см.
7. Ajax http://erud.by/ajax
8. Ajax http://erud.by/ajax
9. Ajax http://erud.by/ajax
10. Документация Laravel http://laravel.com
Задание к курсовой работе
Задание к курсовой работе
Вопросы к экзамену