Декоратор - це структурний патерн проектування в об'єктно-орієнтованому програмуванні, який дозволяє динамічно додавати нову функціональність або змінювати поведінку існуючих об'єктів, не змінюючи їх код. Це досягається шляхом створення нового класу, який обгортає вихідний об'єкт і надає йому додаткові можливості.
Основні компоненти декоратора включають:
* Клас інтерфейсу: Визначає основний інтерфейс для компонентів.
* Основний клас: Реалізує основну функціональність.
* Декоратор: Містить посилання на компонент та реалізує той самий інтерфейс, що й компонент. Додає або змінює функціональність компонента.
* Клас конкретного декоратора: Реалізує конкретні зміни функціональності.
<?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);
?>