Паттерн Decorator (Wrapper) в php

Паттерн «Decorator» («Wrapper») динамически добавляет объекту новые обязанности.
Является гибкой альтернативой подклассам, расширяющим базовый класс.

Схема следующая:
Поместить целевой объект в другой объект, называемый декоратором, который большинство обращений переводит к переданному объекту, а часть (особенности) реализует самостоятельно.
Могут вкладываться друг в друга по цепочке.
Интерфейс декоратора и декорируемого объекта должны совпадать.

Отличается от паттерна «Strategy» тем, что в последнем всё наоборот — главным является целевой объект, который распределяет обращения «расширениям».

Листинг1. Decorator.php (PHP 5.2.5)

Ну, вообще-то, что совсем необязательно AbstractTargetDecorator‘у реализовывать интерфейс ClassInterface. Это сделано для того, чтобы потомки могли друг в друга вкладываться. Хотя это и не нужно для паттерна декоратор.
Можно применить в следующем примере:
Есть 2 типа статей, которые состоят из нескольких типов модулей каждый. Причём эти модули одинаковы для обоих типов статей за исключением механизма их хранения. При этом все они наследуются от класса module.
Специфичность ситуации в том, что данные сохраняются в виде сериализованных объектов модулей, и второй тип статей вводился намного позже первого (накопилось много сохранённых данных).
При этом наследовать каждый модуль второго типа статей от соответствующего модуля первого типа нехорошо, т.к. механизм хранения один для всех модулей одного типа.
Именно в этом случае мог бы помочь паттерн Декоратор: для каждого типа статей создаётся класс, отвечающий за сохранение в зависимости от типа статьи, и декорирующий исходный объект.

LEAVE A COMMENT