Șabloane de descrie o problemă care apare mereu în domeniul nostru de activitate şi indică Proiectare esenţa soluţiei acelei probleme într-un mod care permite utilizarea soluţiei de Design Patterns nenumărate ori în contexte diferite" n Un sablon reprezintă o soluţie comună a unei probleme într-un anumit context.
Șabloane de proiectare 3
Șabloane de Proiectare La ce sunt bune şabloanele?
n Arhitectul C. Alexander. A Pattern n Ne usurează viața…. Language, 1977 n Ne ajută să organizăm mai bine treaba n Gamma, Helm, Johnson, and Vlissides – n Putem sa înțelegem “mai bine” POO Design Patterns, Elements of Reusable n Uneori pot reduce ordinul de complexitate Object-Oriented Software (cunoscuta si al problemei... sub numele “Gang of Four”), 1994 n … sau fac definițiile obiectelor mai ușor de înțeles…
Șabloane de proiectare 2 Șabloane de proiectare 4
Clasificarea şabloanelor (I) Cele mai importante șabloane n După scop: Scop Creationale Structurale Comportamentale Dom. de aplicare ¨ Şabloanele creaţionale (creational patterns) privesc Factory Method Adapter (clasa) Interpreter Clasa Interface Template Method modul de creare al obiectelor. Marker Interface ¨ Şabloanele structurale (structural patterns) se referă Immutable Delegation Chain of Responsibility Abstract Factory Adapter (obiect) Command la compoziţia claselor sau al obiectelor. Builder Bridge Iterator Prototype Composite Mediator ¨ Şabloanele comportamentale (behavioral patterns) Obiect Singleton Decorator Memento Facade Observer caracterizează modul în care obiectele şi clasele Flyweight State interacţionează şi îşi distribuie responsabilităţile Proxy Strategy Visitor
Șabloane de proiectare 5 Șabloane de proiectare 7
Clasificarea şabloanelor (II) Elementele ce descriu un șablon
n Nume: foloseşte pentru identificare; descrie sintetic problema n Domeniu de aplicare: rezolvată de şablon şi soluţia. n Problema: descrie când se aplică şablonul; se descrie problema şi ¨ Şabloanele claselor se referă la relaţii dintre contextul. clase, relaţii stabilite prin moştenire şi care n Solutia: descrie elementele care intră în rezolvare, relaţiile între ele, responsabilităţile lor şi colaborările între ele. sunt statice (fixate la compilare). n Consecinţe si compromisuri: implicaţiile folosirii şablonului, costuri şi beneficii. Acestea pot privi impactul asupra flexibilităţii, ¨ Şabloanele obiectelor se referă la relaţiile extensibilităţii sau portabilităţii sistemului, după cum pot să se refere la aspecte ale implementării sau limbajului de programare utilizat. dintre obiecte, relaţii care au un caracter Compromisurile sunt de cele mai multe ori legate de spaţiu şi timp. dinamic .
Șabloane de proiectare 6 Șabloane de proiectare 8
Șablonul Singleton (II) Structura unui șablon (Clase cu o singură instanță) n nume si clasificare n intentie n Structura: n cunoscut de asemenea ca n motivatie n aplicabilitate n structura n participanti n colaborari n consecinte n implementare n cod n utilizari cunoscute n sabloane cu care are legatura n participant: Singleton n colaborari: clientii clasei
Șabloane de proiectare 9 Șabloane de proiectare 11
Șablonul Singleton (I) Șablonul Singleton (III)
(Clase cu o singură instanță) (Clase cu o singură instanță) n Intenţia n Consecinţe ¨ proiectarea unei clase cu un singur obiect (o singura instanţă) ¨ acces controlat la instanta unica n Motivaţie ¨ într-un sistem de operare: ¨ reducerea spaţiului de nume (eliminarea variab. n exista un sistem de fişiere globale) n exista un singur manager de ferestre ¨ permite rafinarea operaţiilor si reprezentării n Aplicabilitate ¨ permite un numar variabil de insţante ¨ când trebuie să existe exact o instanta ¨ clientii clasei trebuie sa aiba acces la instanta din orice punct ¨ mai flexibila decât operaţiile la nivel de clasă (statice) bine definit n Implementare
Șabloane de proiectare 10 Șabloane de proiectare 12
Șablonul Singleton (IV) Şablonul Observator (I) (Clase cu o singură instanță) 1. #include <iostream.h> 2. using namespace std; 3. 4. class Singleton { public: n Intenţia 5. static Singleton & instance() { 6. return uniqueInstance; ¨ Defineşte o relaţie de dependenţă 1..* între 7. } 8. 9. int getValue() { return data; obiecte astfel încât când un obiect îşi schimbă 10. 11. } void setValue(int value) { starea, toţi dependenţii lui sunt notificaţi şi 12. 13. } data = value; actualizaţi automat 14. private: 15. static Singleton uniqueInstance; 16. int data; 17. Singleton(int d):data(d) { 18. } 19. Singleton & operator=(Singleton & ob); 20. Singleton(const Singleton & ob); 21. };
Șabloane de proiectare 13 Șabloane de proiectare 15
Șablonul Singleton (IV)
Şablonul Observator (II) (Clase cu o singură instanță) 22. Singleton Singleton::uniqueInstance(100); 23. int main(){ n Motivaţia 24. Singleton & s1 = Singleton::instance(); 25. cout << s1.getValue() << endl; 26. Singleton & s2 = Singleton::instance(); 27. s2.setValue(9); 28. cout << s1.getValue() << endl; 29. return 0; 30. }
n Output: 100 9
Șabloane de proiectare 14 Șabloane de proiectare 16
Şablonul Observator (III) Şablonul Observator (V) n Aplicabilitate n Participanti ¨ când o abstracţie are doua aspecte, unul depinzând ¨ Subject de celalalt. Incapsulând aceste aspecte in obiecte n cunoaste observatorii(numarar bitrar) separate, permitem reutilizarea lor in mod ¨ Observer independent n defineste o interfata de actualizare a obiectelor ce trebuie notificate ¨ când obiect necesita schimbarea altor obiecte si nu de schimbarea subiectelor ştie cat de multe trebuie schimbate ¨ ConcreteSubject ¨ când un obiect ar trebui sa notifice pe altele, fara sa n memoreaza starea de interes pentru observatori ştie cine sunt acestea n trimite notificari observatorilor privind o schimbare ¨ ConcreteObserver ¨ in alte cuvinte, nu dorim ca aceste obiecte sa fie n mentine o referinta la un obiect ConcreteSubject cuplate strâns (a se compara cu relaţia de asociere) n memoreaza starea care artrebui sa fie consistenta cu subiectii
Șabloane de proiectare 17 Șabloane de proiectare 19
Şablonul Observator (IV) Şablonul Observator (VI)
n Structura n Colaboratori
Șabloane de proiectare 18 Șabloane de proiectare 20
Şablonul Observator (VII) Şablonul Observator - Cod n Consecinte 1. #include <iostream> 2. #include <vector> ¨ abstractizeaza cuplarea dintre subiect si observator 3. #include <string> 4. ¨ suporta o comunicare de tip “broadcast” 5. class Subject; 6. n notificarea ca un subiect si-a schimbat starea nu necesita 7. class Observer { cunoasterea destinatarului 8. public: 9. virtual void Update(Subject * s) = 0; ¨ schimbari “neasteptate” 10. 11. virtual ~ Observer() { }; n o schimbare la prima vedere inocenta poate provoca 12. }; 13. schimbarea in cascada a starilor obiectelor
Șabloane de proiectare 21 Șabloane de proiectare 23
14. class Subject { n Implementare 15. 16. std::vector < Observer * >observers; protected: ¨ maparea subiectilor la observatori 17. 18. virtual void Notify() { std::vector < Observer * >::iterator iter; n memorarea de referinte la observatori 19. 20. for (iter = observers.begin(); iter != observers.end(); ++iter) (*iter)->Update(this); ¨ observarea mai multor subiecti 21. 22. } public: virtual ~ Subject() { ¨ cine declanseaza o actualizare 23. 24. }; void Attach(Observer * o) { n subiectul apeleaza o metoda Notify() dupa fiecare schimbare 25. 26. } observers.push_back(o);
n clientii sunt responsabili de apela Notify() 27.
28. void Detach(Observer * o) { std::vector < Observer * >::iterator iter; n fiecare solutie are avantaje si dezavantaje (care?) 29. for (iter = observers.begin(); iter != observers.end(); ++iter) 30. if (*iter == o) { ¨ evitarea de referinte la subiecti stersi 31. 32. observers.erase(iter); return; n subiectii ar trebui sa notifice despre stergerea lor (?) 33. } 34. } n ce se intampla cu un observator la primirea vestii? 35. };
Șabloane de proiectare 22 Șabloane de proiectare 24