Візерунок декоратора в PHP
Приклад реалізації шаблону декоратора в PHP
1. Про візерунок декоратора
Шаблон декоратора - це шаблон для можливості динамічного та дуже гнучкого розширення класів за їх властивостями та функціями. Основний принцип полягає в тому, що існує одна або кілька так званих «бетонних складових», а також один або кілька декораторів. Бетонні компоненти розширюються декораторами. Кілька декораторів можна комбінувати або "складати".

Часто наводять приклад кави: магазин продає каву з різними варіантами, такими як вершки, карамель, додаткове молоко або цукор. Наприклад, залежно від добавок варіюються ціна, калорії та час приготування кави. Будь-яка мислима комбінація повинна бути можливою. За малюнком декоратора кава тепер є бетонним компонентом, тоді як вершки, карамель, додаткове молоко та цукор - декораторами. Коли інстанціюється декоратор, або конструктор кави або інший декоратор передається конструктору. Це призводить до поєднання типу крему (вершків (карамель (кава))) або, наприклад, ExtraMilch (додатковий цукор (кава)).
І декоратори, і бетонний компонент реалізують однаковий інтерфейс, в результаті чого до декораторів можуть застосовуватися ті самі функції, що й до бетонного компонента. Наприклад, якщо крайній декоратор викликав метод getPrice () для комбінації ExtraMilch (ExtraZucker (кава)), то він міг би повернути “€ 0,25 + getPrice () з оздобленого об’єкта”. Відповідно, він зателефонує декоратору ExtraZucker, який додає 0,10 євро за тим же принципом і запитує ціну кави.
2. Приклад із рядками
У цьому прикладі шаблон декоратора застосовується до "очищення" рядків, поданих користувачами. Наприклад, зайві пробіли слід видалити та закодувати HTML.
Існує специфічний компонент "SanitizeableString", який слід прикрасити. Для цього доступні декоратори TrimmedString, EncodeHtml та OnlyAtoZ. Перший виконує обрізку () на декорованому рядку, EncodeHtml кодує символи HTML за допомогою htmlentities (), а OnlyAtoZ видаляє всі символи, що не входять в діапазон від a до z. Наприклад, комбінація TrimmedString (EncodeHtml (EncodeHtml (SanitizeableString))) спочатку подвійно кодує рядок із SanitizeableString, а потім обрізає його.