Sunteți pe pagina 1din 7

Ce este un sablon de proiectare?

n Definiția lui Alexander: "Fiecare şablon


Ș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

Şablonul Observator (VIII) Şablonul Observator - Cod


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


Şablonul Observator - Cod Şablonul Observator - Cod
64. int main() {
65. CursValutar c(4.2);
37. class CursValutar:public Subject { 66. Banca b1("BRD");
38. protected: 67. Banca b2("BCR");
39. float valoare; 68. c.Attach(&b1);
40. public: 69. c.Attach(&b2);
41. CursValutar(float v = 0):valoare(v) { 70. c.setCurs(10);
42. } void setCurs(float valoare) { 71. c.Detach(&b1);
43. this->valoare = valoare; 72. c.setCurs(4);
44. Notify(); 73. return 0;
45. } 74. }
46. float getCurs() {
47. return valoare; nOutput
48. }
49. };
Banca BRD a fost notificata ca noua valoare a cursului este: 10

Banca BCR a fost notificata ca noua valoare a cursului este: 10

Banca BCR a fost notificata ca noua valoare a cursului este: 4

Șabloane de proiectare 25 Șabloane de proiectare 27

Şablonul Observator - Cod Bibliografie


51. class Banca:public Observer {
52. std::string nume;
53. public:
54. Banca(std::string _nume):nume(_nume) {
55. } void Update(Subject * s);
56. };
57.
58. void Banca::Update(Subject * s)
59. {
60. CursValutar *c = (CursValutar *) s;
61. std::cout << "Banca " << nume << " a fost notificata ca noua valoare a
cursului este: " << c->getCurs() << std::endl;
62. }
63.

Șabloane de proiectare 26 Șabloane de proiectare 28

S-ar putea să vă placă și