Vzor dekorátora v PHP

Príklad implementácie dekoračného vzoru v PHP

1. O vzore dekoratéra

Vzor dekorátora je vzorom pre možnosť dynamicky a veľmi flexibilne rozširovať triedy v oblasti ich vlastností a funkcií. Základným princípom je, že existuje jeden alebo viac takzvaných „betónových komponentov“, ako aj jeden alebo viac dekoratérov. Betónové komponenty sú rozšírené dekorátormi. Niekoľko dekoratérov je možné kombinovať alebo „stohovať“.

cukor navyše

Často sa uvádza príklad kávy: obchod predáva kávu s rôznymi možnosťami, ako je smotana, karamel, mlieko navyše alebo cukor navyše. V závislosti od prísad sa líšia napríklad cena, kalórie a čas prípravy kávy. Každá predstaviteľná kombinácia by mala byť možná. Podľa vzoru dekorátora je teraz betónom betónová zložka, zatiaľ čo dekorátormi sú smotana, karamel, mlieko navyše a cukor navyše. Keď je dekorátor inštancovaný, konštruktorovi sa odovzdá objekt kávy alebo iný dekorátor. Výsledkom sú kombinácie typu krému (krém (karamel (káva))) alebo napr. ExtraMilch (cukor navyše (káva)).

Dekorátory aj betónový komponent implementujú rovnaké rozhranie, v dôsledku čoho je možné na dekoratéry aplikovať rovnaké funkcie ako na betónový komponent. Napríklad, ak najvzdialenejší dekoratér nazval metódu getPrice () pre kombináciu ExtraMilch (ExtraZucker (káva)), mohol by vrátiť „0,25 € + getPrice () z dekorovaného objektu“. Podľa toho by zavolal dekorátora ExtraZucker, ktorý podľa rovnakého princípu pridá 0,10 EUR a pýta sa na cenu kávy.

2. Príklad s reťazcami

V tomto príklade sa dekoratívny vzor použije na „vyčistenie“ reťazcov odoslaných používateľmi. Mali by ste napríklad odstrániť nadbytočné medzery a kódovať kód HTML.

Existuje špeciálny komponent „SanitizeableString“, ktorý sa má ozdobiť. K tomu sú k dispozícii dekoratéri TrimmedString, EncodeHtml a OnlyAtoZ. Prvý vykoná trim () na zdobenom reťazci, EncodeHtml kóduje znaky HTML pomocou htmlentities () a OnlyAtoZ odstráni všetky znaky, ktoré nie sú v rozsahu od a do z. Napríklad kombinácia TrimmedString (EncodeHtml (EncodeHtml (SanitizeableString))) by najskôr zdvojnásobila kódovanie reťazca zo SanitizeableString a potom ho orezala.