Модел на декоратор в PHP

Пример за изпълнение на шаблона на декоратор в PHP

1. Относно модела на декоратора

Моделът на декоратора е модел за възможност за динамично и много гъвкаво разширяване на класовете по техните свойства и функции. Основният принцип е, че има един или повече така наречени „бетонни компоненти“, както и един или повече декоратори. Бетонните компоненти се разширяват от декораторите. Няколко декоратори могат да бъдат комбинирани или „подредени“.

TrimmedString EncodeHtml

Често се цитира примерът за кафе: магазин продава кафе с различни опции, като сметана, карамел, допълнително мляко или допълнителна захар. В зависимост от добавките например варират цената, калориите и времето за приготвяне на кафето. Всяка възможна комбинация трябва да е възможна. Следвайки модела на декоратора, кафето вече е бетонният компонент, докато сметаната, карамелът, допълнителното мляко и допълнителната захар са декораторите. Когато инстанция на декоратор, или конструктор на кафе, или друг декоратор се предава на конструктора. Това води до комбинации от типа сметана (сметана (карамел (кафе))) или напр. 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 и след това ще го отреже.