Decorator - design pattern

Posted by anghelvalentin on September 13, 2019

Eu am facut ASE-ul, iar in anul 3 am avut o materie care se numea Calitatea si testarea software. Invatam guideline-uri despre cum sa scriem codul, dar am facut si toate design patternurile din cartea The Gang of Four (“Design Patterns: Elements of Reusable Object-Oriented Software”). Sa mai zica lumea ca ASE-ul e o prostie.

Design pattern-urile erau grupate in trei mai categorii: creationale, de structura si de comportament. Daca Singleton e creational, Observer este de comportament, Decorator este structural.

Te intrebi la ce o fi bun acest design pattern. Decorator ne ajuta sa extindem cu functionalitati noi, obiecte ce apartin anumitei clase, fara sa modificam aceea clasa. Practic gandeste-te ca avem o clasa sealed (ce nu mai poate fi derivata). O varianta este sa folosesti acesti design pattern daca totusi vrei sa extinzi functionalitatea acelei clase.


Nu este nimic complicat sa faci acest design pattern. Sa zicem ca vrei sa extinzi functionalitatea clasei XeroxMachine:IPrint, deoarece acum ai si un fax. Clasa PrintDecorator va fi decoratorul nostru, aceasta clasa este una abstracta si va fi implementata de clasele ce vor sa extinda clasa XeroxMachine. Acest decorator are o instanta a clasei XeroxMachine si va implementa in acelasi timp interfata IPrint, unde se va apela metoda print din XeroxMachine.

Metoda Print de mai sus este din clasa PrintDecorator si este implementarea metodei Print din interfata IPrint, iar variabila _printer este instanta clasei XeroxMachine.

Practic cand o noua clasa va implementa decoratorul va putea face override pe metoda Print si apeland metoda din clasa de baza, care la noi este PrintDecorator, iar in metoda Print de fapt se apealeaza metoda de pe instanta de XeroxMachine. De asemenea, in clasa noua putem sa adauagam si fucntionalitati noi pentru xerox. In cazul nostru, xerox-ul a evoluat la fax.

PS: Nu stiu daca ai observat, dar cand am spus la ce se poate folosi acest design pattern, am spus ca poate sa extinda functionalitatea unei clase sealed. In C# avem metode extension, ce pot sa faca acest lucru, practic nemaifiind nevoie de acest design pattern. Bine, bine, acum te intrebi de ce ti-am mai predat acest design pattern. Design pattern-urile au fost pornite din limbaje precum C++ sau Java, unde nu exista functionalitati atat de multe ca in C# (Traiasca C#).

Deci indemnul meu este sa intelegi si acest design pattern, chiar daca vei folosi metode extension.