Sunteți pe pagina 1din 7

Ce este un sablon de proiectare?

Definiia lui Alexander: "Fiecare ablon


descrie o problem care apare mereu n
domeniul nostru de activitate i indic
esena soluiei acelei probleme ntr-un
mod care permite utilizarea soluiei de
nenumrate ori n contexte diferite"
n Un sablon reprezint o soluie comun a
unei probleme ntr-un anumit context.
n

abloane de
Proiectare
Design Patterns

abloane de proiectare

abloane de Proiectare

La ce sunt bune abloanele?

Arhitectul C. Alexander. A Pattern


Language, 1977
n Gamma, Helm, Johnson, and Vlissides
Design Patterns, Elements of Reusable
Object-Oriented Software (cunoscuta si
sub numele Gang of Four), 1994

Ne usureaz viaa.
n Ne ajut s organizm mai bine treaba
n Putem sa nelegem mai bine POO
n Uneori pot reduce ordinul de complexitate
al problemei...
n sau fac definiiile obiectelor mai uor de
neles

abloane de proiectare

abloane de proiectare

Clasificarea abloanelor (I)


n

Cele mai importante abloane

Dup scop:
abloanele creaionale (creational patterns) privesc
modul de creare al obiectelor.
abloanele structurale (structural patterns) se refer
la compoziia claselor sau al obiectelor.
abloanele comportamentale (behavioral patterns)
caracterizeaz modul n care obiectele i clasele
interacioneaz i i distribuie responsabilitile

Scop
Dom. de aplicare

abloane de proiectare

Obiect

Comportamentale

Factory Method

Adapter (clasa)
Interface
Marker Interface

Interpreter
Template Method

Immutable
Abstract Factory
Builder
Prototype
Singleton

Delegation
Adapter (obiect)
Bridge
Composite
Decorator
Facade
Flyweight
Proxy

Chain of Responsibility
Command
Iterator
Mediator
Memento
Observer
State
Strategy
Visitor

abloane de proiectare

Elementele ce descriu un ablon


n

Domeniu de aplicare:

abloanele

claselor se refer la relaii dintre


clase, relaii stabilite prin motenire i care
sunt statice (fixate la compilare).
abloanele obiectelor se refer la relaiile
dintre obiecte, relaii care au un caracter
dinamic .

abloane de proiectare

Structurale

Clasa

Clasificarea abloanelor (II)

Creationale

n
n

Nume: folosete pentru identificare; descrie sintetic problema


rezolvat de ablon i soluia.
Problema: descrie cnd se aplic ablonul; se descrie problema i
contextul.
Solutia: descrie elementele care intr n rezolvare, relaiile ntre ele,
responsabilitile lor i colaborrile ntre ele.
Consecine si compromisuri: implicaiile folosirii ablonului, costuri
i beneficii. Acestea pot privi impactul asupra flexibilitii,
extensibilitii sau portabilitii sistemului, dup cum pot s se refere
la aspecte ale implementrii sau limbajului de programare utilizat.
Compromisurile sunt de cele mai multe ori legate de spaiu i timp.

abloane de proiectare

ablonul Singleton (II)


(Clase cu o singur instan)

Structura unui ablon


n
n
n
n
n
n
n
n
n
n
n
n
n

nume si clasificare
intentie
cunoscut de asemenea ca
motivatie
aplicabilitate
structura
participanti
colaborari
consecinte
implementare
cod
utilizari cunoscute
sabloane cu care are legatura

abloane de proiectare

participant: Singleton
n colaborari: clientii clasei
n

ablonul Singleton (I)


(Clase cu o singur instan)
n
n

proiectarea unei clase cu un singur obiect (o singura instan)

exista un sistem de fiiere


exista un singur manager de ferestre

Aplicabilitate

cnd trebuie s existe exact o instanta


clientii clasei trebuie sa aiba acces la instanta din orice punct
bine definit

abloane de proiectare

Consecine
acces controlat la instanta unica
reducerea spaiului de nume (eliminarea variab.
globale)
permite rafinarea operaiilor si reprezentrii
permite un numar variabil de insante
mai flexibila dect operaiile la nivel de clas (statice)

ntr-un sistem de operare:


n

11

Motivaie

abloane de proiectare

ablonul Singleton (III)


(Clase cu o singur instan)

Intenia

Structura:

10

Implementare

abloane de proiectare

12

ablonul Singleton (IV)


(Clase cu o singur instan)
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.

ablonul Observator (I)

#include <iostream.h>
using namespace std;
class Singleton {
public:
static Singleton & instance() {
return uniqueInstance;
}
int getValue() {
return data;
}
void setValue(int value) {
data = value;
}
private:
static Singleton uniqueInstance;
int data;
Singleton(int d):data(d) {
}
Singleton & operator=(Singleton & ob);
Singleton(const Singleton & ob);
};

abloane de proiectare

Definete

o relaie de dependen 1..* ntre


obiecte astfel nct cnd un obiect i schimb
starea, toi dependenii lui sunt notificai i
actualizai automat

13

ablonul Singleton (IV)


(Clase cu o singur instan)

abloane de proiectare

15

ablonul Observator (II)

22. Singleton Singleton::uniqueInstance(100);


23. int main(){
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. }

Intenia

Motivaia

Output:
100
9
abloane de proiectare

14

abloane de proiectare

16

ablonul Observator (III)


n

ablonul Observator (V)

Aplicabilitate

cnd o abstracie are doua aspecte, unul depinznd


de celalalt. Incapsulnd aceste aspecte in obiecte
separate, permitem reutilizarea lor in mod
independent
cnd obiect necesita schimbarea altor obiecte si nu
tie cat de multe trebuie schimbate
cnd un obiect ar trebui sa notifice pe altele, fara sa
tie cine sunt acestea
in alte cuvinte, nu dorim ca aceste obiecte sa fie
cuplate strns (a se compara cu relaia de asociere)

abloane de proiectare

Subject

Observer
n

cunoaste observatorii(numarar bitrar)


defineste o interfata de actualizare a obiectelor ce trebuie notificate
de schimbarea subiectelor

ConcreteSubject
n

memoreaza starea de interes pentru observatori


trimite notificari observatorilor privind o schimbare

ConcreteObserver
n
n

mentine o referinta la un obiect ConcreteSubject


memoreaza starea care artrebui sa fie consistenta cu subiectii

17

abloane de proiectare

19

ablonul Observator (VI)

Structura

abloane de proiectare

ablonul Observator (IV)


n

Participanti

18

Colaboratori

abloane de proiectare

20

ablonul Observator (VII)


n

ablonul Observator - Cod

Consecinte

1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.

abstractizeaza cuplarea dintre subiect si observator


suporta o comunicare de tip broadcast

notificarea ca un subiect si-a schimbat starea nu necesita


cunoasterea destinatarului

schimbari neasteptate
n

o schimbare la prima vedere inocenta poate provoca


schimbarea in cascada a starilor obiectelor

abloane de proiectare

21

ablonul Observator (VIII)


n

maparea subiectilor la observatori


n

memorarea de referinte la observatori

observarea mai multor subiecti


cine declanseaza o actualizare

n
n
n

subiectul apeleaza o metoda Notify() dupa fiecare schimbare


clientii sunt responsabili de apela Notify()
fiecare solutie are avantaje si dezavantaje (care?)

evitarea de referinte la subiecti stersi


n
n

subiectii ar trebui sa notifice despre stergerea lor (?)


ce se intampla cu un observator la primirea vestii?

abloane de proiectare

class Subject;
class Observer {
public:
virtual void Update(Subject * s) = 0;
virtual ~ Observer() {
};
};

abloane de proiectare

23

ablonul Observator - Cod

Implementare

#include <iostream>
#include <vector>
#include <string>

22

14. class Subject {


15.
std::vector < Observer * >observers;
16.
protected:
17.
virtual void Notify() {
18.
std::vector < Observer * >::iterator iter;
19.
for (iter = observers.begin(); iter != observers.end(); ++iter)
20.
(*iter)->Update(this);
21.
} public:
22.
virtual ~ Subject() {
23.
};
24.
void Attach(Observer * o) {
25.
observers.push_back(o);
26.
}
27.
void Detach(Observer * o) {
28.
std::vector < Observer * >::iterator iter;
29.
for (iter = observers.begin(); iter != observers.end(); ++iter)
30.
if (*iter == o) {
31.
observers.erase(iter);
32.
return;
33.
}
34.
}
35. };

abloane de proiectare

24

ablonul Observator - Cod


37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.

ablonul Observator - Cod


64. int main() {
65.
CursValutar c(4.2);
66.
Banca b1("BRD");
67.
Banca b2("BCR");
68.
c.Attach(&b1);
69.
c.Attach(&b2);
70.
c.setCurs(10);
71.
c.Detach(&b1);
72.
c.setCurs(4);
73.
return 0;
74. }

class CursValutar:public Subject {


protected:
float valoare;
public:
CursValutar(float v = 0):valoare(v) {
} void setCurs(float valoare) {
this->valoare = valoare;
Notify();
}
float getCurs() {
return valoare;
}
};

nOutput
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

ablonul Observator - Cod

abloane de proiectare

27

abloane de proiectare

28

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

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