1. Ingineria programării
10. Șabloane de proiectare
comportamentale (II)
Florin Leon
Universitatea Tehnică „Gheorghe Asachi” din Iași
Facultatea de Automatică și Calculatoare
http://florinleon.byethost24.com/curs_ip.htm
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
2. Șabloane de proiectare
comportamentale (II)
1. Strategia
2. Metoda tipar
3. Starea
4. Interpretorul
5. Vizitatorul
6. Concluzii
7. Recapitularea șabloanelor de proiectare
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
3. 3
Terminologie
Strategy = Strategie
Template Method = Metoda tipar
State = Stare
Interpreter = Interpretor
Visitor = Vizitator
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
4. Notă
Programele care implementează șabloanele
descrise și care pot fi descărcate din pagina
cursului sunt parte integrantă a prezentării
4
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
5. Șabloane de proiectare
comportamentale (II)
1. Strategia
2. Metoda tipar
3. Starea
4. Interpretorul
5. Vizitatorul
6. Concluzii
7. Recapitularea șabloanelor de proiectare
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
14. 14
Definiție
Șablonul Strategie definește o familie de
algoritmi, încapsulează fiecare algoritm și îi
face interschimbabili. Acest șablon permite
algoritmului să varieze independent de clienții
care îl utilizează
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
21. 21
Aplicabilitate
Când mai multe clase înrudite diferă doar prin
modul lor de comportare
Când este nevoie de variante diferite ale unui
algoritm
Când un algoritm utilizează date ce nu trebuie
cunoscute de către clienți
Când o clasă definește mai multe comportamente
iar acestea apar în operațiile ei sub formă de
instrucțiuni condiționale multiple
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
22. 22
Avantaje și dezavantaje
Definește familii de algoritmi înrudiți
Este o alternativă la generarea de subclase
Elimină instrucțiunile condiționale
Poate furniza implementări diferite pentru același
comportament
Număr crescut de obiecte
Unele clase ConcreteStrategy mai simple pot să nu
utilizeze toate informațiile interfeței
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
23. Șabloane de proiectare
comportamentale (II)
1. Strategia
2. Metoda tipar
3. Starea
4. Interpretorul
5. Vizitatorul
6. Concluzii
7. Recapitularea șabloanelor de proiectare
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
24. 24
Cafea și ceai
Rețetele sunt similare
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
28. 28
Definiție
Șablonul Metoda tipar definește scheletul
unui algoritm dintr-o operație, transferând unii
pași către subclase. Șablonul permite
subclaselor să redefinească anumiți pași
dintr-un algoritm fără a schimba structura
acestuia
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
34. 34
Metode ancoră
engl. “hooks”
Pot fi suprascrise
opțional de clasele
derivate
ancoră
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
37. 37
Principiul Hollywood
„Nu ne suna tu, te sunăm noi”
Componentele de nivel scăzut se pot ancora
în sistem, dar componentele de nivel înalt
determină când vor fi folosite acestea și cum
Componentele de nivel înalt apelează
componentele de nivel scăzut și nu invers
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
38. 38
Sortare cu Metoda tipar
Metoda care trebuie
implementată pentru
completarea tiparului
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
39. Sortare cu Metoda tipar
39
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
41. 41
Aplicabilitate
Când un algoritm este compus din părți invariabile,
care sunt tratate o singură dată, și părți variabile,
implementate de subclase
Când comportarea comună a mai multor subclase
poate fi extrasă și localizată pentru evitarea
duplicării codului
Când sunt necesare operații ancoră (engl. “hooks”)
Pentru construirea platformelor (engl. “frameworks”)
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
42. 42
Avantaje
Reprezintă o tehnică fundamentală pentru
reutilizarea codului
Structura de control respectă Principiul
Hollywood: clasa părinte apelează operațiile
unei subclase și nu invers
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
43. 43
Discuție
Metoda tipar utilizează moștenirea pentru a varia părți ale unui
algoritm. Strategia utilizează compunerea pentru a varia întregul
algoritm
Constructorul (engl. “Builder”) construiește un obiect în mai mulți
pași. Metoda tipar execută un algoritm compus din mai mulți pași
Ca și Metoda fabrică, Metoda tipar lasă subclasele să decidă
asupra unor implementări
Ancorele sunt prezente în sistemul de operare Windows
(de exemplu funcția WndProc)
Metodele abstracte sunt obligatorii pentru clasele derivate,
metodele ancoră sunt opționale
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
44. Șabloane de proiectare
comportamentale (II)
1. Strategia
2. Metoda tipar
3. Starea
4. Interpretorul
5. Vizitatorul
6. Concluzii
7. Recapitularea șabloanelor de proiectare
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
47. 47
Abordarea 1
Număr foarte mare de instrucțiuni condiționale
Pentru s stări și n acțiuni, trebuie n metode,
fiecare cu s teste
Aici trebuie 4 metode, fiecare cu 4 teste
Când se adaugă noi stări, trebuie modificate
aceste teste
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
52. 52
Definiție
Șablonul Stare permite unui obiect să-și
modifice comportamentul când starea sa
internă se schimbă. Obiectul va părea că își
schimbă clasa
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
58. 58
Aplicabilitate
Când comportamentul unui obiect depinde de
starea sa
Când operațiile presupun multiple instrucțiuni
condiționale, care depind de starea obiectului
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
59. 59
Avantaje și dezavantaje
Localizează comportarea specifică de stare și
partiționează comportarea pentru diferite stări
Face tranzițiile de stare explicite
Obiectele Stare pot fi partajate, dacă nu au câmpuri
Pot exista mai multe Contexte care partajează Stările
Se face un compromis: creșterea flexibilității pe baza
creșterii numărului de clase
Alternativa: cod monolitic cu numeroase if-uri, greu de
înțeles și modificat
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
60. 60
Discuție
Dacă tranzițiile se fac în clasele de stări, se
creează dependențe între acestea
Tranzițiile fixe se recomandă să fie efectuate în
Context
Tranzițiile dinamice se pot face în Stările Concrete
Pentru aceasta, trebuie să existe metode de acces în
Context pentru schimbarea stării curente
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
61. 61
Discuție
Strategia și Starea au diagrame asemănătoare
Strategia este o alternativă la moștenire. Starea
este o alternativă la instrucțiunile condiționale
Strategiile sunt de obicei specificate de la început
(chiar dacă se pot schimba ușor). Stările se schimbă
dinamic prin însăși motivația șablonului
Obiectele Stare pot fi obiecte de tip Categoria
muscă (engl. “Flyweight”) sau obiecte Singleton
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
62. Șabloane de proiectare
comportamentale (II)
1. Strategia
2. Metoda tipar
3. Starea
4. Interpretorul
5. Vizitatorul
6. Concluzii
7. Recapitularea șabloanelor de proiectare
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
65. 65
Definiție
Șablonul Interpretor definește o
reprezentare a gramaticii unui limbaj
împreună cu un interpretor care utilizează
reprezentarea pentru a interpreta propozițiile
din limbaj
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
72. 72
Aplicabilitate
Când trebuie interpretat un limbaj iar
instrucțiunile sale pot fi reprezentate sub
formă de arbori sintactici abstracți, mai ales:
Când gramatica este simplă
Altfel se pot utiliza generatoare de parsere
(de exemplu Lex, Yacc++, Visual BNF etc.)
Când eficiența nu este un factor critic
Expresiile regulate sunt de obicei transformate în stări
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
73. 73
Aplicații în lumea reală
Parsarea comenzilor utilizatorului
Programe precum Mathematica, Maple (calcul
simbolic) sau Origin (desenare de grafuri)
Generatoare de rapoarte: întrucât interfața cu
utilizatorul este de obicei mai simplă decât
limbajul SQL, se pot defini limbaje de interogare
mai simple, interpretate și traduse apoi în SQL
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
74. 74
Avantaje și dezavantaje
Modificarea și extinderea gramaticii sunt ușor de realizat
Se poate folosi și moștenirea pentru extindere
Implementarea unei gramatici simple este ușor de făcut
Generarea claselor poate fi automatizată
Gramaticile complexe sunt greu de întreținut
Interpretorul necesită câte o clasă pentru fiecare regulă
gramaticală
Adăugarea unei căi noi de interpretare a expresiilor este
dificilă
De exemplu verificarea tipurilor într-o expresie prin definirea unei
noi operații asupra claselor expresiei
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
75. 75
Discuție
Arborele sintactic abstract este o Compunere
(engl. “Composite”)
Categoria muscă (engl. “Flyweight”) poate ajuta
la partajarea simbolurilor terminale din arbore
Interpretorul poate folosi un Iterator pentru a
traversa structura
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
76. Șabloane de proiectare
comportamentale (II)
1. Strategia
2. Metoda tipar
3. Starea
4. Interpretorul
5. Vizitatorul
6. Concluzii
7. Recapitularea șabloanelor de proiectare
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
77. 77
Definiție
Șablonul Vizitator reprezintă o operație care
va fi efectuată pe elementele unei structuri de
obiecte, permițând definirea unei operații noi
fără a schimba clasele elementelor pe care
operează
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
86. 86
Aplicabilitate
Când o structură de obiecte conține multe clase cu interfețe
diferite
Când pe obiectele dintr-o structură trebuie efectuate mai
multe operații neînrudite
Nu se „poluează” clasele cu aceste operații
Când se definesc des noi operații pe structură, dar clasele
structurii nu se modifică des
Dacă o clasă nu are metoda Accept, se poate deriva pentru a
o adăuga
Șablonul este util când nu se pot modifica sursele unor biblioteci
sau platforme pentru adăugarea unor noi funcții
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
87. 87
Avantaje
Facilitează adăugarea de operații noi
Grupează operațiile înrudite și le separă pe cele neînrudite
Vizitatorul poate vizita obiecte care nu au o clasă părinte
comună, spre deosebire de Iterator
Se pot apela metode diferite în Vizitator în funcție de tipul
obiectului vizitat
Alternativa ar fi testarea tipului obiectului
Poate acumula starea pe măsură ce vizitează obiectele
Pot exista mai mulți vizitatori într-un sistem
Apelul bidirecțional Accept – Visit permite adăugarea mai
multor operații la vizitare
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
88. 88
Dezavantaje
Adăugarea de noi clase ConcreteElement este dificilă
Șablonul nu este recomandat în timpul dezvoltării unui sistem,
când numărul de clase crește sau clasele se modifică mult
Poate reduce încapsularea, obligând obiectele vizitate
să-și expună starea internă
Vizitatorul nu poate accesa câmpurile private, deci trebuie să
existe metode publice de acces în obiectele vizitate
Anti-șablonul de proiectare Anemic domain model: logica
programului este implementată în afara obiectelor din
domeniu
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
89. 89
Discuție
Vizitatorul poate fi utilizat la aplicarea unei operații
pe o structură Compusă (engl. “Composite”)
Pentru vizitarea fiecărui element al unei colecții
se poate folosi Iteratorul acesteia
Vizitatorul poate fi utilizat pentru a păstra
într-o singură clasă comportarea fiecărui nod
din arborele sintactic al unui Interpretor
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
90. Șabloane de proiectare
comportamentale (II)
1. Strategia
2. Metoda tipar
3. Starea
4. Interpretorul
5. Vizitatorul
6. Concluzii
7. Recapitularea șabloanelor de proiectare
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
91. 91
Concluzii (ȘPC II)
Strategia definește o familie de algoritmi, încapsulează fiecare
algoritm și îi face interschimbabili
Metoda tipar definește scheletul unui algoritm dintr-o operație,
transferând unii pași către subclase
Starea permite unui obiect să-și modifice comportamentul când
starea sa internă se schimbă
Interpretorul definește o reprezentare a gramaticii unui limbaj
împreună cu un interpretor care utilizează reprezentarea pentru a
interpreta propozițiile din limbaj
Vizitatorul reprezintă o operație care va fi efectuată pe
elementele unei structuri de obiecte, permițând definirea unei
operații noi fără a schimba clasele elementelor pe care operează
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
92. 92
Șabloanele de proiectare (I)
Cunoașterea fundamentelor programării orientate pe obiecte
nu implică automat abilități de proiectare orientată pe obiecte
Proiectele orientate pe obiecte de succes sunt ușor de
reutilizat, extins și întreținut
Șabloanele de proiectare recomandă o serie de modalități de
a proiecta astfel de sisteme
Șabloanele sunt la un nivel mai înalt de abstractizare decât
bibliotecile de funcții
Șabloanele nu au fost inventate, au fost descoperite
rezolvând probleme reale
Reflectă experiența unor proiectanți
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
93. 93
Șabloanele de proiectare (II)
Când sunt folosite corect, șabloanele de proiectare
pot face un sistem mai flexibil și mai ușor de
întreținut
Când sunt folosite fără a fi nevoie, ele cresc inutil
complexitatea sistemului
Cunoașterea șabloanelor de proiectare are
avantajul folosirii unui vocabular comun, ceea ce
permite exprimarea mai succintă a ideilor de
proiectare
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
94. Șabloane de proiectare
comportamentale (II)
1. Strategia
2. Metoda tipar
3. Starea
4. Interpretorul
5. Vizitatorul
6. Concluzii
7. Recapitularea șabloanelor de proiectare
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
96. 96
Metoda fabrică
Șablonul Metoda
fabrică definește o
interfață pentru crearea
unui obiect, dar lasă
subclasele să decidă ce
clasă să instanțieze.
Șablonul permite unei
clase să cedeze
subclaselor instanțierea
de obiecte
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
97. 97
Fabrica abstractă
Șablonul Fabrica
abstractă asigură o
interfață pentru crearea
unor familii de obiecte
înrudite sau
dependente fără a le
specifica clasele
concrete
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
98. 98
Singleton
Șablonul Singleton
asigură faptul că o
clasă are o singură
instanță și oferă un
punct global de acces
la aceasta
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
99. 99
Prototip
Șablonul Prototip
precizează, folosind o
instanță prototip, tipurile
de obiecte ce vor fi
create și creează noile
obiecte copiind acest
prototip
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
100. 100
Constructor
Șablonul Constructor
separă construcția unui
obiect complex de
reprezentarea acestuia,
astfel încât același
proces de construcție
să poată crea
reprezentări diferite
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
102. 102
Adaptorul
Șablonul Adaptor
convertește interfața
unei clase în altă
interfață pe care o
așteaptă clientul.
Adaptorul permite să
funcționeze împreună
clase care altfel nu ar
putea din cauza
interfețelor
incompatibile
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
103. 103
Fațada
Șablonul Fațadă
asigură o interfață
unificată la o mulțime
de interfețe dintr-un
subsistem. Fațada
definește o interfață de
nivel mai înalt care face
subsistemul mai ușor
de utilizat
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
105. 105
Puntea
Șablonul Punte
decuplează o
abstracțiune de
implementarea ei,
astfel încât cele două
să poată varia în mod
independent
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
106. 106
Proxy
Șablonul Proxy asigură
un surogat sau un
înlocuitor pentru alt
obiect pentru a controla
accesul la acesta
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
107. 107
Categoria muscă
Șablonul Categoria
muscă folosește
partajarea pentru a
gestiona eficient un
număr mare de obiecte
de dimensiuni mici
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
108. 108
Compunerea
Șablonul Compunere
compune obiecte în
structuri de tip arbore
pentru a reprezenta
ierarhii parte-întreg.
Șablonul permite
clienților să trateze
uniform obiecte
individuale și
compuneri de obiecte
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
110. 110
Iteratorul
Șablonul Iterator
asigură o cale de
accesare secvențială a
elementelor unui obiect
agregat, fără a expune
reprezentarea lui de
bază
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
111. 111
Observatorul
Șablonul Observator
definește o dependență
1 la N între obiecte,
astfel încât în cazul în
care un obiect își
schimbă starea, vor fi
înștiințate și actualizate
automat toate obiectele
sale dependente
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
112. 112
Comanda
Șablonul Comandă
încapsulează o cerere
ca obiect, permițând
parametrizarea
clienților cu diferite
cereri, formarea unei
cozi de cereri sau
stocarea istoricului
acestora și asigurarea
suportului pentru
anularea operațiilor
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
113. 113
Lanțul responsabilităților
Șablonul Lanțul
responsabilităților evită
cuplarea între expeditorul și
destinatarul unei cereri,
acordând mai multor
obiecte o șansă de a
rezolva cererea. Șablonul
înlănțuie obiectele
destinatar și trece cererea
de-a lungul lanțului până
când un obiect o rezolvă
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
114. 114
Mediatorul
Șablonul Mediator definește
un obiect care încapsulează
modul în care
interacționează o mulțime
de obiecte. Acest șablon
promovează cuplarea
slabă, interzicând obiectelor
să facă referințe explicite
unul la celălalt și permite
modificarea independentă a
interacțiunilor
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
115. 115
Memento
Șablonul Memento
capturează și
exteriorizează starea
internă a unui obiect
fără a viola
încapsularea, astfel
încât obiectul să poată
fi readus ulterior la
respectiva stare
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
116. 116
Strategia
Șablonul Strategie
definește o familie de
algoritmi, încapsulează
fiecare algoritm și îi
face interschimbabili.
Acest șablon permite
algoritmului să varieze
independent de clienții
care îl utilizează
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
117. 117
Metoda tipar
Șablonul Metoda tipar
definește scheletul unui
algoritm dintr-o
operație, transferând
unii pași către
subclase. Șablonul
permite subclaselor să
redefinească anumiți
pași dintr-un algoritm
fără a schimba
structura acestuia
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
118. 118
Starea
Șablonul Stare
permite unui obiect
să-și modifice
comportamentul când
starea sa internă se
schimbă. Obiectul va
părea că își schimbă
clasa
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
119. 119
Interpretorul
Șablonul Interpretor
definește o reprezentare
a gramaticii unui limbaj
împreună cu un
interpretor care utilizează
reprezentarea pentru a
interpreta propozițiile din
limbaj
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
120. 120
Vizitatorul
Șablonul Vizitator
reprezintă o operație
care va fi efectuată pe
elementele unei
structuri de obiecte,
permițând definirea
unei operații noi fără a
schimba clasele
elementelor pe care
operează
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm