CE SUNT TIPARELE SABLOANELE SOFTWARE DESIGN PATTERNS Design

CE SUNT TIPARELE (SABLOANELE) SOFTWARE (DESIGN PATTERNS)? Design patterns – modele, sabloane, tipare de proiectare – sunt solutii reutilizabile la problemele de programare soft cu care ne confruntam mereu. Un sablon ( design pattern ) NU reprezinta o clasa sau o librarie pe care o putem integra in sistemul software: este cu mult mai multe decat atat! Este un model care trebuie implementat in situatia corecta. De asemenea, sablonul nu este specific unui anumit limbaj. Este o experienta intelectuala, o metoda de rezolvare a unei anumite probleme cu care ne-am mai confruntat, iar aceasta trebuie implementata In functie de situatia prezenta.

CE SUNT TIPARELE SOFTWARE (DESIGN PATTERNS)? – CONTINUARE Un sablon, tipar(design pattern) bun ar trebui sa poata fi implementat in toate sau daca nu este posibil, in majoritatea limbajelor. Este important sa se cunoasca faptul ca, orice model de proiectare (design pattern) poate deveni o sabie cu 2 taisuri: daca este implementat in locul nepotrivit, poate deveni un dezastru si poate crea multe probleme.

CATEGORII DE TIPARE Exista 3 categorii de baza de design patterns: Structurale Creationale Comportamentale Tiparele structurale se ocupa de obicei cu relatiile dintre entitati, facand posibil lucrul impreuna a acestor entitati mai usor. Tiparele creationale ofera mecanisme de instantiere, devenind astfel mai usoara crearea obiectelor intr-o maniera profitabila pentru situatia curenta. Tiparele comportamentale sunt folosite in comunicarea dintre entitati si face ca aceasta comunicare sa fie mai usoara si mai flexibila.

DE CE AM UTILIZA TIPARELE DE PROIECTARE SOFTWARE Tiparele software sunt, in principiu, solutii bine gandite la problemele de programare software. Multi programatori au intalnit aceste probleme inainte si au folosit aceste “solutii” pentru a le rezolva. Deci, daca se intalnesc aceste probleme, de ce am reinventa roata regandind o solutie la ele, cand am putea folosi deja o rezolvare demonstrata in timp, putand ocupandu-ne de problemele care inca nu sunt rezolvate?

MODELELE STRUCTURALE ü ü ü 1. Adapter (Wrapper) Aplicabilitate - folosim modelul Adapter atunci cand: Vrem sa folosim o clasa existenta si interfata pe care o folosim nu se potriveste cu cea de care avem nevoie. Vrem sa cream o clasa reutilizabila ce va coopera cu alte clase neprevazute Vrem sa folosim mai multe sub-clase existente dar este imposibil de adaptat interfata lor. (doar in cazul obiectului adaptor) 2. Bridge (Handle/Body) Aplicabilitate – folosim modelul Bridge atunci cand: ü ü Cand vrem sa evitam o legatura permanent intre abstractie si implementare. Atat abstractiile cat si implementarile lor trebuie sa poata fi extinse prin sub-clase. 3. Composite Aplicabilitate – folosim modelul Composite atunci cand: ü Vrem sa reprezentam parti intregi din ierarhia unui obiect Vrem clientii sa poata ignora diferentele dintre compozitii de obiecte si obiecte individuale. ü

4. Decorator (Wrapper) Aplicabilitate – folosim Decorator atunci cand: ü Adaugam responsabilitati obiectelor individuale in mod dinamic si transparent ü Pentru responsabilitati ce pot fi retrase ü Cand extensii cu ajutorul sub-claselor sunt impracticabile. 5. Facade Aplicabilitate - folosim modelul Facade atunci cand: ü Vrem sa oferim o interfata simpla unui subsistem complex ü Exista multe dependente intre clienti si implementarea claselor unei abstractii ü Vrem un subsistem etajat. 6. Flyweight Aplicabilitate – modelul Flyweight se foloseste atunci cand urmatoarele afirmatii sunt corecte: ü O aplicatie foloseste un numar mare de obiecte ü Costul stocarii este mai mare din cauza cantitatii mari de obiecte ü Majoritatea starilor obiectelor pot fi preparate ü Multe grupuri de obiecte pot fi inlocuite de cateva obiecte impartite odata ce starea preparata este eliminata ü Aplicatia nu depinde de identitatea obiectului.

Proxy (Surrogate) Aplicabilitate – proxy este folosit atunci cand este nevoie de o referinta mai diversificata sau sofisticata a unui obiect: ü Un proxy la distanta ofera o reprezentare locala a unui obiect aflat in alt spatiu de adresa. ü Un proxy virtual creaza obiecte scumpe la comanda. ü Un proxy pentru protectie controleaza accesul la obiectul original. COMPARATII INTRE MODELELE STRUCTURALE Adapter vs Bridge vpromoveaza felxibilitatea oferind un nivel indirect unui alt obiect vtrimit mai departe cererile catre acest obiect dintr-o interfata alta decat cea proprie Diferente: üAdapter se ocupa de rezolvarea incompatibilitatii intre doua interfate existente üBridge ofera o interfata stabila clientilor si chiar te lass a variezi clasele care au implementat-o Composite vs. Decorator vs Proxy v Composite si Decorator : ü ambele se bazeaza pe compozitii recursive pentru a organiza un numar nedefinit de obiecte v Decorator si Proxy ü ambele modele descriu cum sa oferi un nivel indirect unui obiect ü implementarea ambelor modele pastreaza o referinta unui alt obiect unde trimit cererile

MODELELE CREATIONALE Abstract Factory ü Ofera o interfata pentru a crea familii de obiecte inrudite sau dependente fara a fi nevoiti sa specificam clasa concreta ü Ofera o ierarhie care incapsuleaza mai multe platforme posibile si posibilitatea de a construi o suita de produse ü Operatorul new devine daunator in instantiere (nu se mai face direct) Builder ü Separa construirea unui obiect complex de reprezentarea, infatisarea sa astfel incat acelasi proces de construire poate crea reprezentari, infatisari diferite. ü Analiza unei reprezentari complexe, crearea uneia din mai multe obiecte dorite ü Problema apare de obicei atunci cand o aplicatie trebuie sa creeze elemente ale unui ansamblu complex. Specifiicatiile pentru acest ansamblu sunt date intr-un spatiu secundar unul sau mai multe din reprezentari trebuiesc construite in spatiul primar. Factory Method ü Defineste o interfata de creare a unui obiect dar lasa clasele derivate (subclasele) sa decida cum instantiaza obiectul. Factory Method lasa o clasa sa cedeze modul de instantiere subclaselor ü Se defineste un constructor “virtual” ü Operatorul new devine daunator, inutil ü Exemplu de necesitate a acestui pattern: un framework trebuie sa standardizeze modelul arhitectural pentru o varietate mare de aplicatii dar sa permita aplicatiilor individuale sa-si defineasca propriile obiecte si sa le implementeze modul de instantiere.

Prototype ü Specifica tipurile de obiecte ce se pot crea utilizand o instanta “prototip” si creaza obiecte noi copiind acest prototip ü Se evita subclasele ale unui obiect “creator” in aplicatia client, la fel cum face si abstract factory ü Evita costul crescut al crearii unui obiect nou in modul standard ( utilizand operatorul new) cand aceasta este foarte costisitoare si scumpa pentru o aplicatie data. ü Pentru a implementa acest pattern, se declara o clasa abstracta de baza care specifica o metoda virtuala pura clone(). Orice clasa care este derivata din clasa de baza implementeaza metoda clone(). ü Clientul, in loc sa scrie cod care invoca operatorul new, apeleaza metoda clone() a prototipului sau apeleaza o metoda factory cu un parametreu specificand clasa derivata dorita.

Singleton ü Modelul de proiectare singleton este un model creational ce asigura faptul ca avem o singura instanta a unei clase particulare in timpul rularii programului si ne ofera un punct global de acces la aceasta singura instanta. ü Mecansimul prin care este posibila impunerea unei singure clase este realizat prin definirea constructorului clasei respective ca privat si furnizarea unei metode (care se numeste metoda singleton) care este apelata in momentul in care se doreste instantierea. Aceasta va verifica numarul de instante si va controla procesul de instantiere. ü Patternurile Abstract Factory, Builder si Prototype pot utiliza Singleton in implementarile lor. ü Modelele Singleton sunt de obicei preferate in locul variabilelor globale deoarece: Ø Ø nu “polueaza” spatiul de nume glonal cu variabile nenecesare. permit alocarea si initializarea “lenesa” (adica se amana pand cand acestea sunt intradevar necesare) intru-cat in cele mai multe limbaje, variabilele globale vor consuma intotdeauna multe resurse.

SABLOANE COMPORTAMENTALE 1. Iteratorul 2. Observatorul 3. Comanda 4. Lantul Responsabilitatilor 5. Mediatorul 6. Memento 7. Strategia 8. Metoda Tipar 9. Starea 10. Interpretorul 11. Vizitatorul

ITERATORUL Sablonul Iterator asigura o cale de accesare secventiala a elementelor unui obiect agregat, fara a expune reprezentarea lui de baza.

OBSERVATORUL Sablonul Observator defineste o dependenta 1 la N intre obiecte, astfel incat in cazul in care un obiect isi schimba starea, vor fi instiintate si actualizate automat toate obiectele sale dependente.

COMANDA Sablonul Comanda incapsuleaza o cerere ca obiect, permitand parametrizarea clientilor cu diferite cereri, formarea unei cozi de cereri sau stocarea istoricului acestora si asigurarea suportului pentru anularea operatiilor.

LANTUL RESPONSABILITATILOR Sablonul Lantul Responsabilitatilor evita cuplarea intre expeditorul si destinatarul unei cereri, acordand mai multor obiecte o sansa de a rezolva cererea. Sablonul inlantuie obiectele destinatar si trece cererea de-a lungul lantului pana cand un obiect o rezolva.

MEDIATORUL Sablonul Mediator defineste un obiect care incapsuleaza modul in care interactioneaza un set de obiecte. Acest sablon promoveaza cuplarea slaba, interzicand obiectelor sa faca referinte explicite unul la celalalt si permite modificarea independenta a interactiunilor.

MEMENTO Sablonul Memento captureaza si exteriorizeaza starea interna a unui obiect fara a viola incapsularea, astfel incat obiectul sa poata fi readus ulterior la respectiva stare.

STRATEGIA Sablonul Strategie defineste o familie de algoritmi, incapsuleaza fiecare algoritm si ii face interschimbabili. Acest sablon permite algoritmului sa varieze independent de clientii care il utilizeaza.

METODA TIPAR Sablonul Metoda Tipar defineste scheletul unui algoritm dintr-o operatie, transferand unii pasi catre subclase. Sablonul permite subclaselor sa redefineasca anumiti pasi dintr-un algoritm fara a schimba structura acestuia.

STAREA Sablonul Stare permite unui obiect sa-si modifice comportamentul cand starea sa interna se schimba. Obiectul va parea ca isi schimba clasa.

INTERPRETORUL Sablonul Interpretor defineste o reprezentare a gramaticii unui limbaj impreuna cu un interpretor care utilizeaza reprezentarea pentru a interpreta propozitiile din limbaj.

VIZITATORUL Sablonul Vizitator reprezinta o operatie care va fi efectuata pe elementele unei structuri de obiecte, permitand definirea unei operatii noi fara a schimba clasele elementelor pe care opereaza.
- Slides: 22