Info
Відкрити сторінку на телефоні
Теги: #patterns #GoF patterns #structural patterns

Decorator (Декоратор)

Декоратор - це структурний патерн проектування в об'єктно-орієнтованому програмуванні, який дозволяє динамічно додавати нову функціональність або змінювати поведінку існуючих об'єктів, не змінюючи їх код. Це досягається шляхом створення нового класу, який обгортає вихідний об'єкт і надає йому додаткові можливості.

Основні компоненти декоратора включають:

* Клас інтерфейсу: Визначає основний інтерфейс для компонентів.

* Основний клас: Реалізує основну функціональність.

* Декоратор: Містить посилання на компонент та реалізує той самий інтерфейс, що й компонент. Додає або змінює функціональність компонента.

* Клас конкретного декоратора: Реалізує конкретні зміни функціональності.

                        
<?php
// Інтерфейс компоненту
interface Component {
    public function operation(): string;
}

// Основний клас
class ConcreteComponent implements Component {
    public function operation(): string {
        return "ConcreteComponent: базова операція\n";
    }
}

// Декоратор
class Decorator implements Component {
    protected $component;

    public function __construct(Component $component) {
        $this->component = $component;
    }

    public function operation(): string {
        return $this->component->operation();
    }
}

// Конкретний декоратор
class ConcreteDecoratorA extends Decorator {
    public function operation(): string {
        return "ConcreteDecoratorA(" . parent::operation() . "): додаткова функціональність\n";
    }
}

// Конкретний декоратор
class ConcreteDecoratorB extends Decorator {
    public function operation(): string {
        return "ConcreteDecoratorB(" . parent::operation() . "): додаткова функціональність\n";
    }
}

// Клієнтський код
function clientCode(Component $component) {
    echo "RESULT: " . $component->operation();
}

// Приклад використання
$simple = new ConcreteComponent();
echo "Client: Я можу працювати з простим компонентом:\n";
clientCode($simple);
echo "\n";

$decorator1 = new ConcreteDecoratorA($simple);
$decorator2 = new ConcreteDecoratorB($decorator1);
echo "Client: Тепер я можу сполучати декоратори:\n";
clientCode($decorator2);
?>