Documente Academic
Documente Profesional
Documente Cultură
Ingineria Programelor
Ingineria Programelor
Tipuri de sabloane:
Creationale (instantierea)
Structurale (compunerea)
Comportamentale (comunicarea)
1. Singleton
Sablonul Singleton asigura faptul ca o clasa are doar o singura instanta si furnizeaza
un punct de acces global catre aceasta.
- este o clasa care poate avea o singura instanta( ex.ferestrele sistemului de operare)
- foloseste stari globale, ceea ce nu este foarte indicat pentru ca face codul greu de
inteles ( starea obiectului putand fi schimbata oriunde)
- este dificil de testat din cauza starilor globale
- dependentele nu apar explicit, din cauza starilor globale. Solutia la aceastra
problema este injectarea unei dependente (trimiterea ca parametru in constructor sau
intr-o metoda setter sau normala)
2. Prototype
Sablonul Prototype precizeaza, folosind o instanta prototip, tipurile de obiecte ce vor
fi create si creaza noile obiecte copiind acest prototip.
- prototype = clonare
- o alternativa a instantieri clasei este realizarea unei clone a unui obiect
- clona are starea sursei la momentul crearii
- foloseste o interfata care are definita o metoda clone()
- ex. Template-urile din word. Sunt prototipuri de documente completate partial, care
urmeaza sa fie completate de utilizator
- problema principala este clonarea obiectului (superficiala sau profunda). O
alta problema este initializarea unor valori dupa clonare
3. Builder
Sablonul Builder separa constructia unui obiect complex de reprezentarea acestuia,
astfel incat acelasi proces de constructie sa poata crea reprezentari diferite
- folosit des in parsere
- din clasa parinte, generala, se deriveaza alti constructori care au aceleasi date,
dar sunt contruite/redefinite altfel. Datele sunt aranjate altfel => obiectul este
construit diferit.
- incapsuleaza logica de construire/ambalare a obiectului, astfel incat clientul
doar cere o configuratie
Concluzii:
Sablonul Singleton garanteaza ca dintr-o clasa poate exista doar o singura
instanta.
Sablonul Prototype are ca scop clonarea instantelor de obiecte bazate pe
obiecte prototip.
Sablonul Builder abstractizeaza pasi de construire a unui obiect astfel incat
diferite implementari ale acestor pasi pot construi reprezentari diferite.
2. Facade
Sablonul Facade asigura o interfata unificata la o multime de interfete dintr-un sistem.
Defineste o interfata de nivel mai inalt care face subsistemul mai usor de utilizat.
- in momentul in care avem multe interfete de folosit, putem defini una care sa
le contina pe toate, si noi sa lucram cu acea interfata.
- decupleaza clientul de subsistem si multele lui componente, insa subsistemul poate
fi accesat si direct (pentru ca nu il incapsuleaza)
- scopul este sa simplifice interfata
Acest sablond lucreaza impreuna cu Principiul cunoasterii minime.
Principiul cunoasteri minime
- este recomandat sa apelezi metode doar din: obiect/clasa, obiectele primite
ca parametru, obiectele instantiate de metoda
- nu este recomandat sa apelezi metoda ale obiectelor returnate de alte metode
3. Decorator
Sablonul Decorator ataseaza responsabilitati suplimentare unui obiect in mod dinamic.
Asigura o alternativa flexibila la derivare pentru extinderea functionalitatilor.
- se foloseste impreuna cu principiul deschis-inchis
- este folosit pentru a schimba comportamentul permitand adaugarea de functionalitati
noi
4. Bridge
Sablonul Bridge decupleaza o abstractiune de implementarea ei, astfel incat cel 2 sa
poata varia in mod independent
Ex. Vizualizarea listei de proprietati ale controlerelor( componente ale interfetei) este
implementata folosind sablonul Bridge; telecomanda universala pentru tv (care
functioneaza si la samsung, sony, ….)
- este util cand vrem sa dezvoltam platforme diferite
- clientul interactioneaza direct cu interfata. Interfata interactioneaza cu clasa
abstracta de implementare, avand o referinta catre acesta ( referinta fiind
initializata
cu o instanta a unei clase concrete). Prin intermediul interfetei, clientul poate accesa
doat metodele din clasa abstracta (clasele concrete fiind incapsulate).
5. Proxy
Sablonul Proxy asigura un surogat sau un inlocuitor al unui obiect pentru a controla
accesul la acesta.
Ex. Incarcarea unei imagini mari de pe net ( Proxy-ul afiseaza un mesaj pana cand
imaginea este incarcata si poate si afisata)
- poate face gestiune a resurselor, trata cereri sau chiat instanti obiecte
- intercepteaza un apel pe care il trimite catre obiectul tinta
6. Flyweight
Sablonul Flyweight foloseste partajarea pentru a gestiona eficient un numar mare de
obiecte de dimensiuni mici.
Ex. Lista de foldere ( care sunt la fel, doar ca difera starea: selectat sau neselectat);
simbolurile din editoarele de documente
-foloseste liste de tip cheie-valoare in care sunt pastrate obiectele deja create de
fabrica
- poate fi implementat folosind singleton si proxy
7. Composite
Sablonul Composite compune obiecte in structuri de tip arbore pentru a reprezenta
ierarhii de tip parte-intreg.
- composite are responsabilitatea de a gestiona ierarhia si executa operatii, ceea
ce incalca principiul responsabilitatii unice. Ca si compromis, nodurile si frunzele
se trateaza similar.
- foloseste sablonul iterator
- clientul trateaza uniform toate obiectele din structura ( chiar daca ele sunt
compuneri de obiecte sau obiecte individuale)
Concluzie:
Sablonul Adapter converteste interfata unei clase in alta interfata pe care o
asteapta clientul.
Sablonul Facade asigura o interfata unificata la o multime de interfete dintr-un
subsistem.
Sablonul Decorator ataseaza responsabilitati suplimentare unui obiect in mod
dinamic.
Sablonul Bridge decupleaza o abstractiune de implementarea ei, astfel cele doua
sa poata varia in mod independent.
Sablonul Proxy asigura un inlocuitor sau surogat al unui obiect pentru a controla
accesul la acesta.
Sablonul Flyweight foloseste partajarea pentru a gestiona un numar mare de
obiecte de dimensiuni reduse.
Sablonul Composite compune obiecte in structuri de tip arbore pentru a
reprezenta ierarhii parte-intreg si permite clientui sa trateze uniform obiectele
individuale sau compuneri de obiecte.
2. Observer
Sablonul Observer defineste o dependenta 1 la N intre obiecte, astfel incat in cazul in
care un obiect isi schimba starea, vor fi instiintate si actualizate toate obiectele sale
dependente.
- Subiectul e singurul proprietar al datelor caracteristice sablonului
- Subiectul stie doar ca observatorii implementeaza o interfata (update)
- se pot adauga oricand observatori noi, tipuri de observatori noi
- subiectul si observatorii nu se afecteaza unul pe altul
- protocoale specifice: pull (extragere) si push (impingere)
- in cazul relatiilor compexe intre subiect si observator, se poate implementa un obiect
intermediar ChangeManager care sa gestioneze interactiunea
Ex. Evenimentele componentelor interfetei utilizator; evenimentele actionate de timp
(timer, trigger)
3. Command
Sablonul Command incapsuleaza o cerere ca obiect permitand trimiterea ca parametru
a unei functii incapsulate intr-un obiect, formarea de cozi de cereri si stocarea
istoricului (logging), asigura suport pentru anularea operatiilor.
- diminueaza cuplarea dintre client si obiectele receiver
- incapsularea codului de tratare a evenimentelor
4. Chain of Responsability
Sablonul Chain of Responsability evita cuplarea intre expeditorul si destinatarul unei
cereri acordand mai multor obiecte o sansa de a rezolva cererea. Sablonul inlantuie
obiectele destinatar si trece cererea de-a lungul lantului pana cand un obiect o rezolva.
Ex. Cererea de cumparare este trecuta pe la mai multe persoane din ierarhie pana cand
este aprobata
- este folosit cand o cerere poate fi rezolvata de mai multe obiecte, dar nu stim care
- reduce cuplarea ( expeditorul si destinatarul nu se cunosc, si nici lantul)
- creste flexibilitatea ( pot fi adaugate responsabilitati noi sau modificat lantul)
- dezavantajul e ca o cerere poate ramane nerezolvata
5. Mediator
Sablonul mediator defineste un obiect care incasuleaza modul in care interactioneaza
o multime de obiecte.
- promoveaza cuplarea slaba, interzicand obiectelor sa faca referinta explicite unul la
celalalt.
Ex. Camera de chat; Formularele (componentele se schimba unul pe altu in functie de
actiunile utilizatorului; ele nu stiu unul de altul, comunica prin intermediul Form-ului)
- este util atunci cand comunicarea intre obiecte este bine definita, dar complexa
- cand reutilizarea unui obiect este dificila deoarece comunica cu multe alte obiecte
- ofera decuplare si simplifica comunicarea, insa apare centralizarea controlului (“God
object”)
6. Memento
Sablonul Memento capteaza si exteriorizeaza starea interna a unui obiect fara a viola
incapsularea, astfel incat obiectul poate fi readus la respectiva stare.
Ex. Salvarea starii unui joc; Salvarea listei de cumparaturi (produselor din cos)
- util pentru ca pastreaza incapsularea si simplifica retinerea istoricului
- copierea poate fi costisitoare (volum mare de date)
7. Strategy
Sablonul Strategi defineste o familie de algoritmi, incapsuleaza fiecare algoritm si ii
face interschimbabili. Acest sablon permite algoritmilor sa varieze independent de
clientul care ii utilizeaza.
Ex. Sortari, tipuri de grafice, tipuri de personaje dintr-un joc
- util cand clase inrudite difera doar prin comportament
- este necesar o varianta diferita a unui algoritm
- alternativa la generarea de subclase
8. State
Sablonul State permite unui obiect sa-si modifice comportamentul cand starea sa
interna se schimba. Obiectul va parea ca isi schimba clasa.
- util cand avem multe if-uri (teste) pentru a verifica starea unui
obiect, comportamentul obiectului depinzand de starea acestuia
- tranzitiile de stari sunt explicite
- pentru cresterea flexibilitatii (eliminarea if-urilor) se creste numarul de clase
9. Interpreter
Sablonul Interpreter defineste o reprezentare a gramatici unui limbaj impreun cu un
interpretor care utilizeaza reprezentarea pentu a interpreta propozitiile din limbaj.
Ex. Cifre romane, rapoarte
- cand se doreste a se face un parser intre limbaje de programare
- parsarea comenzilor utilizatorului, comenzi simple date de utilizator sunt traduse
in comenzi mai complexe pe are le executa calculatorul
Concluzie:
Sablonul Iterator asigura o cale de acces secvential a elementelor unui obiect
agregat, fara a expune reprezentarea lui de baza.
Sablonul Observer permite ca un obiect sa notifice alte obiecte atunci cand se
produc modificari in starea sa initiala
Sablonul Command este un obiect-functie care incapsuleaza apelul unei metode
din alt obiect
Sablonul Chain of Responsability incearca rezolvarea unei cereri cu ajutorul
unui numar necunoscut de obiecte
Sablonul Mediator incapsuleaza protocolul de comunicare al obiectelor
Sablonul Memento reprezinta starea interna a unui obiect la un anumit moment
de timp
Sablonul Strategy defineste o familie de algoritmi, incapsuleaza fiecare
algoritm si ii face interschimbabili
Sablonul State permite unui obiect sa-si modifice comportamentul cand starea sa
interna se modifica
Sablonul Interpreter defineste o reprezentare a gramatici unui limbaj impreuna
cu un interpretor care utilizeaza reprezentarea petru a interpreta propoziitiile
din limbaj
Metoda Factory
Scop
Defineşte o interfaţă pentru crearea unui obiect, dar lasă
subclasele să decidă ce clasă să instanţieze.
Metoda Factory permite unei clase să defere instanţierea
subclaselor
Cunoscut şi ca
Constructor Virtual
Aplicabilitate
O clasă nu poate anticipa clasa obiectelor pe care trebuie să le
creeze
O clasă doreşte ca subclasele sale să specifice obiectele pe care
le creează
Clasele delegă responsibilitatea uneia sau mai multor subclase
ajutătoare
Product
defineşte interfaţa obiectelor ce vor fi create de FM
Produs Concret implementează interfaţa
Creator
declară FM, care returnează un produs de tip Product.
poate defini o implementare implicită a FM
poate apela FM pentru crearea unui produs
ConcreteCreator
suprascrie FM pentru a furniza o instanţă a ConcreteProduct
Creator se bazează pe subclasele sale pentru definirea metodei factory
astfel încât să returneze instanţa potrivită a clasei ConcreteProduct
Elimină legarea între clasele specifice aplicaţiei din cod
codul de creare foloseşte doar interfaţa clasei Product
Facilitează derivarea
subclasele pot astfel modifica produsul creat
Poate conecta ierarhii paralele de clase
lasă clienţii să apeleze FM
Slide-ul următor...
Metoda Prototype
Scop
Specificaţi tipul obiectelor care se creează folosind o instanţă
prototipică
Creaţi obiecte noi copiind acest prototip
Aplicabilitate
când un sistem trebuie să fie independent de cum sunt create,
compuse şi reprezentate produsele sale şi
când clasele de instanţiat sunt specificate la execuţie
evitaţi construirea unei ierarhii de clase-factory paralelă cu
ierarhia claselor de produse
Prototype
declară o interfaţă pentru a se clona.
ConcretePrototype
implementează o operaţie pentru a se clona.
Client
creează un obiect nou cerând prototipului să se cloneze.
Un client cere unui prototip să se cloneze.
Clasa client trebuie să se iniţializeze în constructor
cu prototipul concret adecvat.
Adăugarea şi ştergerea produselor la execuţie
Mai puţină derivare
evită ierarhia paralelă pentru creatori
Specificarea de obiecte noi prin varierea valorilor prototipurilor
clientul se comportă diferit prin delegarea către prototip
Specificarea de obiecte noi prin varierea structurii prototipurilor
produse compuse
Fiecare subclasă a Prototype trebuie să implementeze clone
dificil când clasele există deja sau
obiectele interne nu permit copierea sau au referinţe circulare
Metoda Singleton
Scop
Asigură ca o clasă să aibă doar o singură instanţă şi furnizează
un punct de acces global la ea
Aplicabilitate
dorim exact o instanţă a unei clase
accesibilitate pentru clienţi dintr-un singur punct
dorim ca instanţa să fie extensibilă
poate permite deasemenea şi un set numărabil de instanţe
optimizare faţă de vizibilitatea globală
mai bine decât o clasă statică:
nu se poate răzgândi
metode niciodată virtuale
Acces controlat la instanţa unică
Permite rafinarea operaţiilor şi reprezentării
Permite un număr variabil (dar precis) de instanţe
Reducerea vizibilităţii globale
Metoda Iterator
Furnizează o modalitate de accesare secvenţială a elementelor unui agregat,
fără a expune reprezentarea care stă la baza acestora
Obiectele listă îşi creează poropriul iterator prin metoda CreateIterator;
CreateIterator este o metodă Factory, care conectează cele două ierarhii
(slide-ul precedent.)
Folosiţi şablonul Iterator:
Pentru a accesa conţinutul unui obiect agregat fără să îi expuneţi
reprezentarea internă
Pentru a susţine traversări multiple ale obiectelor agregat
Pentru a furniza o interfaţă uniformă de traversare a diferitelor
structuri agregat (i.e. pentru a susţine iteraţii polimorfice)
Un ConcreteIterator ţine evidenţa obiectului curent din agregat, şi
poate calcula următorul obiect din traversare
MEMENTO
-COMPORTAMENTAL-
Captează şi externalizează starea internă a unui obiect astfel încât
obiectul poate fi restaurat în această stare mai târziu, fără a sparge
încapsularea
Folosiţi când:
(o parte din) starea unui obiect trebuie salvată pentru a readuce
mai târziu obiectul în această stare
O interfaţă directă pentru obţinerea stării ar expune detalii de
implementare şi ar sparge încapsularea obiectului
Şablonul Mediator
Scop
Defineşte un obiect ce încapsulează cum interacţionează o
mulţime de obiecte
Promovează cuplajul redus prin faptul că obiectele nu mai fac
referinţă direct unele la altele, permiţând varierea independentă a
interacţiunii lor
Folosiţi Mediator când:
O mulţime de obiecte comunică într-un mod bine definit dar
complex;
Interdependenţele sunt nestructurate şi dificil de înţeles;
Refolosirea unui obiect este dificilă deoarece comunică cu prea
multe alte obiecte
Un comportament distribuit între mai multe clase ar trebui să fie
readaptabil fără derivare
Limitează derivarea
Modificarea comportamentului necesită doar derivarea
Mediatorului, clasele Colleague pot fi refolosite ca atare
Decuplează colegii
Putem varia şi refolosi clasele Colleague şi Mediator
independent
Simplifică protocoalele obiectelor
Înlocuieşte interacţiunile mai-mulţi-la-mai-mulţi cu interacţiuni
unul-la-mai-mulţi (mai uşor de înţeles, extins, menţinut)
Abstractizează cooperarea obiectelor
Ajută la clarificarea interacţiunilor independent de
comportamentul individual
Centralizează controlul
Mediatorul se poate transforma într-un monolit dificil de
întreţinut
Şablonul Strategy
Scop
Defineşte o familie de algoritmi, încapsulează fiecare algoritm, îi
face interschimbabili
Permite algoritmului să varieze independent de clienţii ce îl
folosesc
Aplicabilitate
Sunt necesare variante diferite ale unui algoritm
Un algoritm foloseşte date despre care clienţii nu trebuie să ştie
evită expunerea structurilor de date complexe, specifice
algoritmului
Multe clase relaţionate diferă doar prin comportament
configurează o clasă cu un comportament particular
Consecinţe Pozitive
Familii de algoritmi înrudiţi
de obicei oferă implementări diferite ale aceluiaşi comportament
alegerea se face ţinând cont de un compromis timp-spaţiu
Alternativă la derivare
Exemplul cu layout managers (soluţia Strategy, slide 9)
Încă se derivează strategiile...
Elimină instrucţiunile condiţionale
multe instrucţiuni condiţionale "invitaţie" să aplicăm Strategy!
Consecinţe Negative
Exces de comunicare între Strategy şi Context
o parte din ConcreteStrategies nu necesită informaţiile trimise de
Context
Clienţii trebuie să fie conştienţi de diferitele strategii
clienţii trebuie să înţeleagă diferitele strategii
SortedList studentRecords = new SortedList(new ShellSort());
Număr sporit de obiecte
fiecare Context foloseşte obiectele sale concrete de strategie
se poate reduce prin păstrarea strategiilor fără stare (împărţirea
lor între mai multe obiecte)
Şablonul State
Scop
permite unui obiect să îşi modifice comportamentul când i se
modifică starea internă
obiectul va părea că îşi schimbă clasa
Aplicabilitate
comportamentul obiectului depinde de starea sa
trebuie să îşi modifice comportamentul la execuţie în funcţie de
stare
operaţii cu instrucţiuni condiţionale multiple, depinzând de
starea obiectului
starea reprezentată de una sau mai multe constante
enumerate
mai multe operaţii cu aceeaşi structură condiţională
Şablonul Proxy
Scop
Furnizează un surogat (substitut) pentru alt obiect pentru a
controla accesul la el
Aplicabilitate
Oricând este nevoie de o referinţă către un obiect mai flexibilă
sau mai sofisticată decât un simplu pointer
Proxy la distanţă
Proxy virtual
Proxy de Protecţie
Proxy -accesorii (pointeri inteligenţi)
Previn ştergerea accidentală a obiectelor (numără
referinţele)
proxy (n. pl prox-ies) Agent pentru o persoană care se comportă ca
substitut pentru aceasta, autoritatea de a acţiona în locul altcuiva
Proxy-urile introduc un nivel de indirectare (ocolire)
folosit diferit în funcţie de tipul de proxy:
Ascunderea spaţiului adresă (p. la distanţă)
Crearea la cerere (p. virtual)
Permite activităţi auxiliare adiţionale (protecţie, pointeri
inteligenţi)
Copiază-în-timp-ce-scrii [J.Coplien92 - The "Handle Class" Idiom]
copierea obiectelor mari şi complicate e costisitoare
folosiţi proxy pentru copiere numai când obiectul nou este
modificat
Subiectul trebuie numărat pe baza referinţei
proxy incrementează contorul în timpul copierii
Când apar modificări, copiază şi decrementează contorul
if (counter == 0) delete Subject
Şablonul Bridge
Scop
Decuplează o abstracţiune de implementarea sa
Permite implementării să varieze independent de abstracţiunea
sa
Abstracţiunea defineşte şi implementează interfaţa
Toate operaţiile din abstracţiune apelează metode din
obiectul de implementare
În şablonul Bridge ...
... o abstracţiune poate folosi implementări diferite
... o implementare poate fi folosită în diferite abstracţiuni
Evită legarea permanentă între o abstracţiune şi implementarea sa
Abstracţiunile şi implementările lor trebuie să fie independentl
extensibile prin derivare
Ascunde implementarea unei abstracţiuni complet de clienţi
Codul lor nu trebuie să fie recompilat când se modifică
implementarea
Partajează o implementare între mai multe obiecte
Şi acest lucru trebuie ascuns de client
Şablonul Composite
Scop
Tratează obiectele individuale şi compunerile acestor obiecte
uniform
Compune obiectele în structuri arborescente pentru a reprezenta
agregări recursive
Aplicabilitate
reprezentarea ierarhiilor de obiecte de tip parte-întreg
abilitatea de a ignora diferenţa dintre compuneri de obiecte şi
obiecte individuale
Şablonul Flyweight
Foloseşte partajarea pentru a suţine implementarea eficientă a unui
număr mare de obiecte cu granulaţie fină (structură complexă)- de
exemplu caractere individuale sau iconiţe pe ecran
Un flyweight este un obiect partajat care poate fi folosit simultan în
contexte diferite
Numărul de instanţe se reduce semnificativ, prin recunoaşterea faptului
că de fapt clasele sunt la fel cu excepţia câtorva parametri
Concept cheie: distincţia între stare intrinsecă (păstrată în flyweight,
independentă de context) şi stare extrinsecă (depinde şi variază în
funcţie de context, deci nu poate fi partajată)
Folosiţi când toate condiţiile de mai jos sunt îndeplinite simultan:
O aplicaţie foloseşte un număr mare de obiecte
Costurile de stocare sunt ridicate din cauza numărului mare de
obiecte
Cea mai mare parte din starea unui obiect poate fi făcută
extrinsecă
Multe grupuri de obiecte se pot înlocui de un număr relativ mic
de obiecte partajate, odată ce am îlăturat starea extrinsecă
Aplicaţia nu depinde de identitatea obiectelor. Întrucât obiectele
flyweight pot fi partajate, testele de identitate vor întoarce true
pentru obiecte conceptual distincte
Şablonul Adapter
Converteşte interfaţa unei clase într-o altă interfaţă aşteptată de client
Permite unor clase cu interfeţe diferite să lucreze împreună (prin
“traducerea” interfeţelor)
Un editor de desenare lucrează cu obiecte grafice ce implementează
clasa abstractă Shape
Dacă LineShape sau PolygonShape sunt uşor de implementat
(capacităţi limitate de desenare şi editare), o clasă TextShape ce poate
afişa şi edita text este mai dificilă (actualizare ecran, buffering…)
Dacă dorim să utilizăm o clasă predefinită TextView care tratează
textul corect, definim clasa TextShape care adaptează interfaţa
TextView la cea alui Shape
TextShape- adapter
Editorul de text poate refolosi astfel clasa incompatibilă TextView
Şabloane relaţionate
Bridge
Au structuri similare, dar Bridge are un scop diferit: să separeu o
implementare de interfaţa sa, astfel încât cele două să poată fi
variate mai uşor, independent un ade alta.În schimb, adaptorul
are scopul de a modifica interfaţa unui obiect existent
Decorator
Îmbogăţeşte un obiect fără să-i schimbe interfaţa- deci e mai
transparent pentru aplicaţie, decât un adaptor; în consecinţă,
decoratorul suportă compoziţie recursivă, ceea ce nu e posibil cu
adaptorii puri
Proxy
Defineşte un reprezentant (surogat) pentru un obiect, fără să-i
schimbe interfaţa
Şablonul Decorator
Scop
Adaugă responsabilităţi unui obiect particular, mai degrabă
decât clasei sale
Ataşează dinamic responsabilităţi adiţionale unui obiect.
O alternativă flexibilă la derivare
Cunoscut şi ca
Wrapper
Aplicabilitate
Adaugă responsabilităţi obiectelor transparent şi dinamic
i.e. fără să afecteze alte obiecte
Extinderea prin derivare nu e practică
poate duce la prea multe subclase