Documente Academic
Documente Profesional
Documente Cultură
1. Introducere
abloanele ce se pot refolosi pot fi general valabile sau specifice unui domeniu, de
exemplu pentru probleme de concuren, sisteme distribuite, programare n timp real,
etc.
2. Clasificare
Cele mai rspndite tipuri de cadre sunt cele destinate crerii de interfee grafice.
3. Definiie
Criterii de clasificare:
Scop - abloanele pot fi creaionale, structurale sau comportamentale.
o abloanele creaionale (creational patterns) privesc modul de creare al
obiectelor.
o abloanele structurale (structural patterns) se refer la compoziia
claselor sau al obiectelor.
o abloanele comportamentale (behavioral patterns) caracterizeaz
modul n care obiectele i clasele interacioneaz i i distribuie
responsabilitile.
Domeniu de aplicare - abloanele se pot aplica obiectelor sau claselor.
o abloanele claselor se refer la relaii dintre clase, relaii stabilite prin
motenire i care sunt statice (fixate la compilare).
abloanele creaionale ale claselor acoper situaiile n care o
parte din procesul crerii unui obiect cade n sarcina
subclaselor.
abloanele structurale ale claselor descriu modul de utilizare a
motenirii n scopul compunerii claselor.
abloanele comportamentale ale claselor utilizeaz motenirea
pentru descrierea unor algoritmi i fluxuri de control.
o abloanele obiectelor se refer la relaiile dintre obiecte, relaii care
au un caracter dinamic.
abloanele creaionale ale obiectelor acoper situaiile n care o
parte din procesul crerii unui obiect cade n sarcina unui alt
obiect.
abloanele structurale ale obiectelor descriu cile prin care se
asambleaz obiecte.
abloanele comportamentale ale obiectelor descriu modul n
care un grup de obiecte coopereaz pentru a ndeplini o sarcin
ce nu ar putea fi efectuat de un singur obiect.
n tabelul de mai jos sunt incluse cele mai importante abloane, clasificate dup
criteriile enumerate anterior:
Scop
Domeniu de Creationale Structurale Comportamentale
aplicare
Factory Method Adapter (clasa) Interpreter
Clasa Interface Template Method
Marker Interface
Immutable Delegation Chain of Responsibility
Abstract Factory Adapter (obiect) Command
Builder Bridge Iterator
Prototype Composite Mediator
Obiect Singleton Decorator Memento
Facade Observer
Flyweight State
Proxy Strategy
Visitor
Mesajele reprezint singura cale prin care un obiect este determinat s execute o
operaie, n timp ce operaiile sunt singurul mod de a modifica datele interne ale
obiectului. Din cauza acestor restricii starea intern a obiectului se spune c este
ncapsulat: ea nu poate fi accesat direct, iar reprezentarea ei este invizibil dinspre
exteriorul obiectului.
Obiectele ce compun un sistem pot varia enorm ca mrime i ca numr. Ele pot
reprezenta practic orice ncepnd de la componente hardware pn la aplicaii ntregi.
Cum decidem ce ar trebui sa fie un obiect?
Exist abloane care acoper i acest aspect. Astfel, ablonul Facade descrie modul n
care subsisteme complete pot fi reprezentate ca obiecte, ablonul Flyweight arat cum
se poate gestiona un numr uria de obiecte la nivelurile cele mai fine de
granularitate. Alte abloane descriu cile prin care un obiect poate fi descompus n
obiecte mai mici. Abstract Factory i Builder reprezint obiecte a cror unic
responsabilitate este crearea de alte obiecte. Visitor i Command reprezint obiecte a
cror unic responsabilitate este implementarea unui mesaj ctre alt obiect sau grup de
obiecte.
Un tip este un nume utilizat pentru a referi o anumit interfa. Astfel, vom spune
despre un obiect c este de tipul Window dac el accept toate mesajele
corespunztoare operaiilor definite n interfaa numit Window. Ca urmare, un obiect
poate avea mai multe tipuri, adic o parte a interfeei sale poate fi de un tip, iar alt
parte de alt tip. De asemenea, mai multe obiecte pot partaja un anumit tip comun, daca
interfeele lor includ tipul respectiv. Interfeele pot s conin, la rndul lor, alte
interfee ca submulimi. Avnd dou tipuri, T1 i T2, vom spune c T1 este subtip al
lui T2 dac interfaa T1 include interfaa T2. n acest caz T2 este supertip al lui T1.
Mai spunem ca T1 motenete interfaa T2.
Interfeele sunt lucruri fundamentale n sistemele OO. Obiectele sunt cunoscute doar
prin intermediul interfetelor lor. O interfa nu d nici un detaliu relativ la
implementarea unui obiect, iar obiecte distincte pot implementa n mod diferit o
aceeasi cerere. Altfel spus, dou obiecte avnd implementri complet diferite pot avea
interfee identice.
Cnd o cerere este trimis unui obiect, operaia care se va executa depinde de:
cerere
obiectul care receptioneaz cererea.
Obiecte diferite care pot recepiona cereri identice pot avea implementri diferite ale
operaiilor ce vor satisface cererile respective. Asocierea unei cereri cu un obiect i cu
o operaie a obiectului la momentul execuiei se numete asociere (legare) dinamic
(dynamic binding). Asocierea dinamic permite scrierea de programe n care:
la emiterea unei cereri s nu ne preocupe ce obiect o va recepiona, tiindu-se
c orice obiect a crui interfa include o semntura potrivit va fi bun;
obiecte avnd interfee identice pot fi substituite unul altuia la executie;
aceast posibilitate de substituire se mai numete polimorfism.
Implementarea unui obiect este definit prin intermediul clasei obiectului. Clasa unui
obiect specific datele interne ale obiectului i definiiile operaiilor pe care acesta le
poate executa.
Obiectele sunt create prin instanierea unei clase; se mai spune c un obiect este o
instan a unei clase. Procesul de instaniere a unei clase presupune alocarea de
memorie pentru datele interne ale obiectului respectiv i asocierea operaiilor cu
aceste date. O clas poate fi instaniat de mai multe ori, n felul acesta rezultnd mai
multe exemplare similare de obiecte.
Pe baza unor clase existente se pot defini noi clase, folosind motenirea claselor. O
subclas motenete de la una sau mai multe clase printe (superclase) toate datele i
operaiile definite n acestea din urm. Obiectele instane ale subclasei vor
conine toate datele definite n subclasa i n clasele printe
putea executa toate operaiile definite n subclasa i n clasele printe.
O clas abstract are drept scop principal definirea unei interfee comune pentru
subclasele sale. Implementarea operaiilor unei clase abstracte este pasat parial sau
n ntregime subclaselor sale. De aceea, o clas abstract nu poate fi instaniat.
Operaiile declarate ntr-o clas abstract, dar neimplementate se numesc operaii
abstracte. Clasele care nu sunt abstracte se numesc clase concrete.
O subclas poate detalia sau redefini comportamentul claselor printe. Mai precis,
subclasa poate redefini (override) o operaie care apare i ntr-o clas printe, ceea ce
permite subclasei s poat prelua cereri n locul superclasei.
O clasa mixin este o clas care are drept scop oferirea unei interfee sau a unei
funcionaliti opionale altor clase. Ea este similar unei clase abstracte, n sensul c
nu poate fi instaniat, dar nu poate figura singur ca printe al unor subclase, ci doar
ntr-o schem de motenire multipl.
Este important s inelegem diferena ntre clasa unui obiect i tipul obiectului.
Clasa definete starea intern a obiectului i implementarea operaiilor lui. Tipul
obiectului se refer doar la interfaa obiectului - setul cererilor la care obiectul poate
rspunde. Un obiect poate avea mai multe tipuri, iar obiecte de clase diferite pot avea
acelai tip.
Desigur c ntre clas i tip exist o strns legtura: prin faptul c o clas definete
operaiile pe care un obiect le poate executa, automat ea definete i tipul obiectului.
Cnd spunem c un obiect este instan a unei clase, aceasta nseamn c obiectul
posed interfaa definit de clasa respectiv.
Este destul de uor de confundat aceste concepte ntre ele deoarece majoritatea
limbajelor de programare OO nu le disting n mod explicit. De exemplu n C++
motenire nseamn att motenire de clas, ct i de interfa. O difereniere ntre
cele dou s-ar putea face astfel:
motenirea de interfa poate fi redat ca o derivare public a unei clase
abstracte (o clas care conine funcii-membru pur virtuale);
motenirea de clas poate fi modelat prin derivarea privat a unei clase.
Clasele derivate dintr-o clas abstract vor partaja interfaa acelei clase. Subclasele
vor aduga sau vor redefini operaii, dar nu vor ascunde operaii ale clasei printe. n
felul acesta toate subclasele vor putea rspunde la cererile corespunztoare interfeei
clasei abstracte printe.
Exist doua avantaje ale manipulrii obiectelor prin intermediul interfeelor definite n
clasele abstracte:
clienii nu trebuie s tie tipurile particulare ale obiectelor utilizate, atta timp
ct obiectele respective sunt compatibile cu interfaa pe care clienii o
ateapt;
clienii nu trebuie s tie care sunt clasele care implementeaz obiectele
respective, tiu doar despre clasele abstracte care definesc interfaa.
Nu declara variabile ca fiind instane ale unor clase concrete, mai degrab angajeaz-
te s foloseti o interfa definit printr-o clas abstract. Cnd este necesar
instanierea unor clase concrete, se recomand aplicarea abloanelor creaionale
(Abstract Factory, Builder, Factory Method, Prototype, Singleton) care permit
abstractizarea procesului de creare a obiectelor. n felul acesta se realizeaz o asociere
a unei interfee cu implementrile ei transparent la momentul instanierii.
Motenirea de clas este cunoscut i sub numele de reutilizare tip cutie alb (white-
box reuse) deoarece n majoritatea cazurilor o parte din starea intern a claselor
printe este vizibil n subclase.
class Parent {
//. . .
public:
void Operation1( );
void Operation2( ); //apeleaza metoda Operation1
};
class Child: public Parent {
//. . .
public:
void Operation1( ); //redefineste Operation1
//Operation2 ramane cea mostenita
};
void aFunction( ) {
Parent p;
Child c;
p.Operation2( );
c.Operation2( );
//deoarece Operation2 apeleaza Operation1, metoda se va comporta
//diferit pentru cele 2 obiecte
}
Dezavantaje:
Toate aceste aspecte conduc spre formularea celui de-al doilea principiu al proiectrii
OO:
n mod ideal nu ar trebui create noi componente pentru a realiza reutilizarea. Pentru
obinerea funcionalitii dorite trebuie doar asamblate componentele prin intermediul
compoziiei obiectelor existente. n practic ns aceasta nu se poate realiza n
totalitate deoarece setul de componente disponibile nu este niciodat destul de bogat.
Reutilizarea prin motenire este mai uor de folosit pentru a face componente noi n
comparaie cu compunerea componentelor deja existente. De aceea motenirea i
compunerea obiectelor sunt folosite mpreun.
Delegarea
Asocierea, numit i relaie de utilizare (de tip "using"), presupune c un obiect pur i
simplu tie de existena altui obiect. Cele dou obiecte asociate pot cere operaii unul
altuia dar nu sunt responsabili unul fa de altul. Asocierea este o relaie mai slab
dect agregarea i sugereaz o cuplare mai slab ntre obiecte.
Cele dou tipuri de relaii pot fi uor confundate din cauz c pot fi implementate n
mod asemntor. n C++ agregarea se poate implementa prin definirea de membrii
variabil ce sunt instane adevrate dar este mai folosit practica s o definim prin
pointeri sau referine la instane. Asocierea este implementat i ea prin pointeri i
referine.
Multe dintre abloanele de proiectare, mai ales cele care au domeniul de aplicare la
nivel de obiect, capteaz distincia dintre structurile stabilite la compilare i cele de la
execuie, n sensul c un specialist care cunoate abloanele de proiectare poate
detecta mai uor n codul surs structurile ce se vor crea la execuie.
6. Tema
1. Pornind de la introducerea n abloane de proiectare, dai exemple de aplicare a
urmtoarelor relaii:
agregare
asociere
motenire de clas
motenire de interfa
Indicatie:
Se are in vedere construirea urmatoarei ierarhii de clase:
- clasa abstracta engine
- clasele derivate din engine -> dieselEngine si gasEngine
- clasa abstracta car
- clasele derivate din car -> automobile si truck