+ All Categories
Home > Documents > Sabloane de proiectare

Sabloane de proiectare

Date post: 23-Dec-2015
Category:
Upload: petru-voloceai
View: 228 times
Download: 16 times
Share this document with a friend
Description:
exemple si definitii ale sabloanelor de proiectare, pattern-uri
33
SABLOANE DE PROIECTARE (Design Patterns) Șabloane creaționale Abstract Factory (Kit) http://labs.cs.upt.ro/doc/DP/dpRoot.html Reprezintă o interfață pentru crearea obiectelor din aceeași familie sau interdependente, fără a specifica clasa din care fac parte. Se considera un generator de interfete grafice utilizator (GUI) care ofera suport pentru standarde multiple privind modul de prezentare a elementelor interfetei. Sablonul Abstract Factory se utilizeaza cand: -un sistem trebuie sa fie independent de modul in care produsele sale sunt create; -un sistem trebuie sa fie configurat la un moment dat cu una din mai multe familii de produse; -se doreste crearea unei biblioteci de produse pentru care sunt relevante doar interfetele, nu si implementarile (de exemplu, in cazul generatorului de interfete , nu ne intereseaza cum sunt desenate pe ecran diversele elemente de control, ci doar care sunt efectele actionarii lor de catre utilizator si aceste efecte sunt asemenatoare, indiferent de standardul de prezentare). 1
Transcript
Page 1: Sabloane de proiectare

SABLOANE DE PROIECTARE (Design Patterns)

Șabloane creaționale

Abstract Factory (Kit) http://labs.cs.upt.ro/doc/DP/dpRoot.html

Reprezintă o interfață pentru crearea obiectelor din aceeași familie sau interdependente, fără a

specifica clasa din care fac parte.

Se considera un generator de interfete grafice utilizator (GUI) care ofera suport pentru standarde multiple privind modul de prezentare a elementelor interfetei.

Sablonul Abstract Factory se utilizeaza cand:

-un sistem trebuie sa fie independent de modul in care produsele sale sunt create;

-un sistem trebuie sa fie configurat la un moment dat cu una din mai multe familii de produse;

-se doreste crearea unei biblioteci de produse pentru care sunt relevante doar interfetele, nu si implementarile (de exemplu, in cazul generatorului de interfete , nu ne intereseaza cum sunt desenate pe ecran diversele elemente de control, ci doar care sunt efectele actionarii lor de catre utilizator si aceste efecte sunt asemenatoare, indiferent de standardul de prezentare).

Fig. 1 Structura generală a șablonului Abstract Factory

AbstractFactory - declara o interfata pentru operatii de creare a produselor abstracte;

ConcreteFactory - implementeaza operatiile de creare a produselor concrete;

AbstractProduct - declara o interfata pentru o categorie de produse;

ConcreteProducto defineste un produs care va fi creat de un obiect ConcreteFactory corespunzator;o implementeaza interfata AbstractProduct;

Client - utilizeaza doar interfetele AbstractFactory si AbstractProduct.

1

Page 2: Sabloane de proiectare

Constructorul (Builder) http://labs.cs.upt.ro/labs/SPM/html/SPM10.html

Construeste obecte complexe separind construirea de reprezentare.Def: Este sablonul care descrie crearea unor obiecte in regim pas cu pas, in conditiile in care procesul de creare este independent de structura interna a obiectelor.

Builder specifica o interfata abstracta pentru crearea partilor obiectelor produs.

Fig. 2 Structura generală a șablonului Builder

Builder: este interfata pentru crearea partilor unui obiect (produsul). ConcreteBuilder:

o construieste si asambleaza partile unui produs, implementand interfata Builder;o defineste si pastreaza un istoric al reprezentarilor pe care le creaza;o ofera o interfata pentru obtinerea produsului finit.

Director: construieste un obiect folosind interfata Builder. Product:

o reprezinta obiectul complex care se construieste. Concrete Builder construieste reprezentarea interna a produsului si defineste procesul prin care produsul este asamblat;

o poate include clase care definesc partile componente ale produsului si interfete pentru asamblarea partilor intr-un produs final.

2

Page 3: Sabloane de proiectare

Factory Method

Creaza obecte fara a specifica clasa exacta pentru creare.

Acest sablon defineste o interfata pentru crearea unui obiect, dar lasa subclasele sa decida ce clasa trebuie instantiata. Practic, presupune ca o clasa paseaza subclaselor sale sarcina instantierii.

Practic Factory Method ii lipseste pe proiectanti de necesitatea plasarii codului care depinde de clasele aplicatiei.Codul are legatura cu interfata clasei Product de aceia el poate sa conlucreze cu orice clasa definita de utilizator. Utilizam acest sablon cind :

o clasa nu poate anticipa clasa obiectelor pe care trebuie sa le creeze; o clasa doreste ca subclasele sale sa specifice ce obiecte trebuie sa creeze;

Sablonul Factory Method pune in legatura un obiect independent de aplicatie cu unul dependent de aplicatie care va fi delegat sa creeze alte obiecte dependente de aplicatie. Structura de obiecte propusa este cea din figura:

Fig. 3 Structura generală a șablonului Factory MethodOperatia FactoryMethod din CreatorConcret va contine o instructiune de forma:

return new ProdusConcret;iar in clasa Creator, celelalte functii, de exemplu AltaOperatie, vor putea apela FactoryMethod sub forma:

Produs *p = FactoryMethod;Rolurile claselor componente din structura de mai sus sunt:

Produs: defineste interfata obiectelor pe care la va crea metoda de generare; ProdusConcret: implementeaza interfata Produs; Creator:

o declara metoda de generare, care are referinta la Produs ca tip returnat. Aceasta metoda poate sa aiba si o implementare prin care sa se returneze un obiect al unei clase ProdusConcret implicite;

o poate apela metoda de generare pentru a crea obiecte de tip Produs. CreatorConcret: redefineste metoda de generare pentru a crea obiecte de tip ProdusConcret.

3

Page 4: Sabloane de proiectare

Prototype

Creaza obiecte clonind un obect deja existent.(se combina cu builder) Cind folosim:-Cind instantele clasei se definesc in timpul executiei.-Cind se doreste evitarea erarhiilor de clase sau fabricei care corespund erahiilor de produse.-Cind instantele unei clase pot avea una sau citeva combinatii(stari).

Fig. 4 Structura generală a șablonului Prototype

Clasa Prototype- declara o clasa pentru clonare.ConcretePrototype-implementeaza operatii de clonare.Client-Creaza obecte noi prin clonarea prototipului.

4

Page 5: Sabloane de proiectare

Singleton http://labs.cs.upt.ro/labs/SPM/html/SPM10.html#singleton

Restrictioneaza crearea unui obiect pentru o clasa doar la o instanta.Creaza premizele ca o anumita clasa sa fie instantiata doar o singura data, permitandu-se un acces global la instanta respectiva. Cind se foloseste:

trebuie ca pentru o anumita clasa sa existe doar o singura instanta si aceasta trebuie sa fie accesibila clientilor dintr-un punct de acces cunoscut; 

instanta unica a unei clase trebuie sa poata fi extinsa prin derivare, iar clientii sa poata utiliza instanta extinsa fara a-si modifica propriul cod..

Fig. 5 Structura generală a șablonului Singleton

class Singleton {public:

static Singleton* Instance(); //alte metode accesibile clientilor

protected:Singleton();

private:static Singleton* _instance;

}; Singleton* Singleton::_instance = 0; Singleton* Singleton::Instance(){

if(_instance==0) _instance=new Singleton; return _instance;

}

5

Page 6: Sabloane de proiectare

Object pool

Ofera o crestere de performanta semnificativa si este in deosebi eficienta in cazurile cind costurile de initializare a unui obiect sunt mari, frecventa de instantiere a clasei e innalta, iar nr de instante folosita in orice moment de timp este mic.Bazinul de obecte (este un Singleton) este folosit pentru managementului hasului de obecte.Un client cu accesul la bazinul de obecte poate evita crearea obectelor noi doar prin crearea insantelor deja create din bazin.

Fig. 6 Structura generală a șablonului Object Pool

Reuseble-sunt instantele claselor care vor fi folosite un timp limitat de client iar apoi reintoarse in bazin.Client- instante a claselor care utilizeaza Reuseble.ReuseblePool- fac menegementul obectelor Reuseble pe care le folosesc obectele client.

6

Page 7: Sabloane de proiectare

Sabloane structurale

Adapterul http://labs.cs.upt.ro/labs/SPM/html/SPM11.html#adapterAdapter de clasa –permite claselor cu interfete incompatibile sa lucreze impreuna creind interfata proprie pentru a satisfice necesitatea clasei.Acest sablon realizeaza conversia interfetei unei clase intr-o alta interfata, asteptata de client.Sablonul Adapter se aplica in situatiile in care:

se doreste utilizarea unei clase deja existente, a carei interfata nu se potriveste cu necesitatile aplicatiei; 

se doreste crearea unei clase reutilizabile care coopereaza cu clase ale caror interfete nu sunt compatibile intre ele; 

Clientii apeleaza operatii ale unei instante a clasei Adapter. Aceasta, la randul ei, apeleaza operatii ale clasei Adaptee, pentru a satisface cererile. 

Target: defineste interfata specifica domeniului, solicitata de client; Client: colaboreaza cu obiecte care se conformeaza interfetei Target; Adaptee: defineste o interfata existenta care necesita adaptare; Adapter: adapteaza interfata Adaptee la interfata Target.

unde operatia BuildTree este:BuildTree(node n){

delegate -> GetChildren(this,n); for each child {

AddGraphicNode(delegate -> CreateGraphicNode(this,child)) BuildTree(child)

}}

7

Page 8: Sabloane de proiectare

Bridge (Puntea)Definitie

Este un sablon care realizeaza decuplarea unei abstractiuni de implementarea ei, astfel incat cele 2 pot

varia independent.

Context Cand o anumita abstractiune poate avea mai multe variante de implementare, de obicei se utilizeaza mostenirea: o clasa abstracta defineste interfata abstractiunii, iar subclasele concrete o implementeaza in diverse moduri. Aceasta abordare nu este intotdeauna suficient de flexibila. Prin mostenire o implementare este legata permanent de abstractiune si acest lucru face foarte dificila modificarea independenta a abstractiunii si a implementarii.Exemplu : Abstractizarea este Windows –interfata grafica, ce efectuiaza mostenirea la 2 subclase XWindow si PMWindow ,insa apare oproblema cu definirea subclase cum ar fi: IconWindow,

TransientWindow. Sablonul Bridge isi propune sa solutioneze aceste probleme plasand abstractiunea Window si implementarea ei in ierarhii separate. Astfel, vom avea o ierarhie formata din clasa Window, cu subclasele IconWindow si TransientWindow, respectiv o ierarhie separata, formata din clase care depind de platforma: WindowImpl cu subclasele XWindowImpl si PMWindowImpl:

Operatiile care apar in clasele din prima ierarhie sunt operatii specifice diverselor tipuri de ferestre, in timp ce operatiile care apar in a 2-a ierarhie depind de platforma grafica. De Exemplu:

void IconWindow::DrawBorder(Point nv, int w, int h){DrawRect(nv,w,h); DrawText();

} void TransientWindow::DrawCloseBox(Point nv, int w, int h){

DrawRect(nv,w,h);}

void XWindowImpl::DevDrawText(){

XDrawString(); //operatie oferita de platforma X} void XWindowImpl::DevDrawLine(Point s, Point d){

XDrawLine(s,d); }

8

Page 9: Sabloane de proiectare

Composite(Compunerea)Compunerea presupune crearea a 0 sau mai multe obiecte similarea astfel incite le sa fie manipulate ca un obiect intreg.

Component (Graphic) – defineste interfata;-ofera realizarea unor operatii predefinite Leuf (Rectangle, Line, Text, и т.п.) - frunza:- reprezinta noduri frunza si nu are urmasi.Composite (Picture) - составной объект:-defineste comportamentul componentelor care au urmasi;Client - клиент:- манипулирует объектами композиции через интерфейс Component.Clientul foloseste interfata clasei Component pentru a interactiona cu obectele.Daca cel care primeste cererea este Leaf atunci el o si prelucreaza.Daca destinatarul este Composite , de obicei el retransmite cererea la ceilalti din canal.

class Equipment {public:virtual -Equipment ( ) ;const char* NameO { return _name; }virtual Watt Power ();virtual Currency NetPrice();virtual Currency DiscountPrice ( ) ;virtual void Add ( Equipment *);virtual void Remove (Equipment*) ;virtual Iterator<Equipment*>* Createlterator ();protected:Equipment (const char*);private:const char* _name;}

Decoratorul (Decorator)9

Page 10: Sabloane de proiectare

Adauga sau supraincarca dynamic comportamentul unei metode existente intr-un obiect. Decoratorul foloseste mostenirea pentru a prelua tipul obiectului decorat si compunerea pentru

ai schimba comportamentul Se pot utiliza unul sau mai multi decorator pentru un obiect . Decoratorii pot fi create cu sabloanele fabrica si constructor.

Context De multe ori, intr-o aplicatie, se doreste adaugarea de functiuni suplimentare unor obiecte individuale, nu unei intregi clase. Spre exemplu, un generator de interfete utilizator trebuie sa permita proiectantului adaugarea de elemente cum ar fi barele de defilare sau chenarele oricarei componente a interfetei. O posibilitate de a adauga functiuni o reprezinta mostenirea. Decoratorul respecta interfata componentei pe care o "decoreaza", astfel incat prezenta lui este transparenta pentru clientii componentei. Sa presupunem, de exemplu, ca avem un obiect al unei clase TextView, care afiseaza un text intr-o

fereastra. TextView nu va avea bare de defilare in mod implicit, deoarece nu are nevoie de ele

intotdeauna. Atunci cand este necesar, se poate utiliza un obiect ScrollDecorator pentru a aduga bare de

defilare. Motivatii

Sablonul Decorator se aplica in urmatoarele situatii:

-pentru a adauga functiuni in mod dinamic si transparent unor obiecte individuale;

-pentru a putea elimina anumite functionalitati;

class VisualComponent {public:VisualComponent();virtual void Draw();virtual void Resize();// ...};

Component – defineste interfata pentru obecte,posibil diniamic.ConcreteComponent (TextView) – se defines obectele care au obligatii suplimentare.Decorator - декоратор: pastreaza adresele la obectele Component .ConcreteDecorator (BorderDecorator, ScrollDecorator) – indatoriri suplimentare pentru decorator.

Facade

10

Page 11: Sabloane de proiectare

Sablonul Façade sau Facade este la fel utilizat in programarea obiect orientate. O façade este un obiect ce furnizeaza o interfata simplificata la un cod mare, cum ar fi o librarie de clase.El poate face codul cu mult mai usor de citit deoarece, contine metode utile pentru sarcini simple. Furnizeaza o interfata unica pentru un set mai larg de interfete intr-un subsistem. Façade defineste o interfata de nivel inalt ce usureaza cu mult utilizarea subsistemului. Se utilizeaza foarte frecvent.Sablonul Facade descrie modul in care subsisteme complete pot fi reprezentate ca obiecte.

Motivatie:– subsisteme - reducerea complexitătii– Minimizarea comnunicatiei dintre subsisteme

Aplicabilitate:– Se doreste utilizarea unei interfete simplificate la un sistem complicat– Există multe dependente între clienti si implemetările concrete ale conceptelor– Se doreste stratificarea sistemului

- Facade

Determina care clase ale subsistemului sunt responsabile pentru o cerere.

Atribuie cererile clientului obiectului subsistemului apropiat.

- Subsystem classes

Implementeaza functionalitatile subsistemului.

Responsabil de lucrul atribuit obiectului Façade

Nu contine nicio informative despre fasada si nu are nici o referinta la ea.

Flyweight11

Page 12: Sabloane de proiectare

Musca-foloseste partajarea pentru a gestiona efficient un numar mare de obiecte de dimensiuni mici ,mai reduce costul crearii si manipularii de obiecte similar

Se utilizeaza:-Aplicatia utilizeaza un numar mare de obecte;

12

Page 13: Sabloane de proiectare

Proxy

Sablonul Proxy asigura un surogat sau un inlocuitor pentru alt obiect pentru a controla accesul la acesta.Delegarea la distanta-controleaza accesul catre un obiect nelocalDelegarea virtuala- controleaza accesul la o resursa costisitor de creat.Delegarea de protectie-controleaza accesul la o resursa pe baza unor drepturi de acces.Referinta inteligenta: copierea la scriere (copy on write) blocarea unui obiect ,numararea referintelor ,caching.Proxy afiseaza un mesaj pina cind imaginea este incarcata si poate fi afisata.

Proxy:o contine o referinta (realSubjectRef) care permite accesul la obiectul real.

Aceasta referinta ar putea fi de tip Subject daca Subject si RealSubject au aceeasi interfata;

o ofera o interfata identica cu Subject, astfel incat un obiect Proxy poate substitui obiectul RealSubject din punct de vedere al clientului;

o controleaza accesul la obiectul real si poate fi responsabil de crearea si stergerea acestuia;

o alte responsabilitati ale obiectului Proxy depind de tipul lui: un proxy de tip ambasador redirecteaza o cerere de la client spre obiectul

real, aflat la distanta; un proxy virtual poate ingloba informatii suplimentare despre obiectul

real, care vor putea fi utilizate chiar in absenta obiectului respectiv; proxy-ul de protectie verifica daca clientul are drepturile de acces

necesare pentru a putea solicita un anumit serviciu. Subject: defineste o interfata comuna pentru RealSubject si Proxy, astfel incat un

obiect Proxy sa poata fi folosit oriunde se asteapta un obiect RealSubject; RealSubject: defineste obiectul real pe care il reprezinta Proxy.

13

Page 14: Sabloane de proiectare

Chain of responsibilityEvita cuplarea intre expeditorul si destinatarul unei cereri acordind mai multor obecte o sansa de a rezolva cererea.Sablonul inlantueste obiectele destinatar si trece cererea dea lungul lantului pina cind un obect o rezolva.

Utilizam cind :-Cererea poate fi rezolvata de mai multe obecte;-Doriti sa generate o cere catre unul din mai multe obecte fara a preciza in mod explicit destinatarul.

14

Page 15: Sabloane de proiectare

CommandIncapsuleaza o cerere ca obect ,permitind astfel sa parametrizam clientii cu diferite cererei, sa formeze o coada sau un registru de cereri sis a asigure support pentru operatiile ce pot fi anulate.

class Command {public:virtual ~Command ();virtual void Execute () = 0;protected:Command ( ) ;};

15

Page 16: Sabloane de proiectare

InterpretorPentru un limbaj dat , acest sablon defineste o reprezentare a gramaticii limbajului impreuna cu un interpretor care utilizeaza reprezentarea pentru a interpreta proprietatile din limbaj. Ex. Cautarea sirurilor care corespund unui model.

16

Page 17: Sabloane de proiectare

Iteratorul

Iterator – acceseaza elementele unui obiect secvential fara a arata reprezentarea acestuia.Sablonul Iterator se aplica pentru:a accesa elementele unui agregat, fara a se cunoste reprezentarea interna a acestuia; a permite traversari multiple simultane ale aceluiasi agregat; a crea o interfata uniforma in vederea traversarii diferitelor structuri de agregate (cu alte cuvinte, pentru a crea suportul iterarii polimorfice).

In figura de mai jos este data structura de clase care constituie sablonul Iterator:

Iterator - defineste interfata pentru accesarea si traversarea elementelor agregatului;IteratorConcretimplementeaza interfata Iterator;tine evidenta pozitiei curente la traversarea agregatului;Agregat - defineste interfata pentru crearea unui obiect Iterator;AgregatConcret - implementeaza interfata de creare a iteratorului, sub forma:return new ConcreteIterator(this);

Consecinte

Exista 3 consecinte importante:

1. Sablonul Iterator ofera posibilitatea de a modifica tipul de traversare a unui agregat. Exista agregate care pot fi traversate in mai multe feluri. De exemplu, intr-un compilator, analiza semantica si generarea de cod se fac in timpul traversarii arborelui sintactic. Acesta poate fi parcurs in inordine sau in preordine. Pentru a schimba tipul parcurgerii doar se inlocuieste iteratorul. 2. Iteratorul simplifica interfata Agregat, care nu mai trebuie sa contina operatii specifice parcurgerii (parcurgerilor). 3. Deoarece fiecare instanta a unui iterator pastreaza pozitia elementului curent pe durata parcurgerii unui agregat, este posibil ca acelasi agregat sa fie parcurs in paralel prin intermediul a mai multi ietartori.

17

Page 18: Sabloane de proiectare

Mediator Permite cuplarea slaba intre clase prin faptul ca este singura clasa ce contine cunostinte detaliate despre metodele lor.

Definește un obiect care încapsulează modul în care un set de obiecte interacționează. De obicei, un program este compus dintr-un număr mare de clase. Deci, logica și calculul este

distribuit între aceste clase. Cu toate acestea, după cum mai multe clase sunt dezvoltate într-un program, în special în timpul întreținerii și / sau refactorizare, problema de comunicare între aceste clase pot deveni mai complexe. Acest lucru face ca programul mai greu de citit și să mențină. Mai mult, poate deveni dificil de a schimba programul, deoarece orice schimbare poate afecta cod în mai multe alte clase.

18

Page 19: Sabloane de proiectare

Memento –Memento - este un model de software de proiectare, care oferă posibilitatea de a restabili un

obiect la starea sa anterioară (undo prin derulare înapoi).

Modelul memento este implementat cu trei obiecte: original, un îngrijitor și o amintire. Emitentul este un obiect care are o stare internă.Îngrijitorul va face ceva la origine, dar vrea să fie în măsură să anula schimbarea.Îngrijitor solicită în primul rând de origine pentru un obiect amintire. Apoi face tot ce operație (sau secvență de operații) a fost de gând să facă. Pentru a face revenirea la starea de dinaintea operațiunilor, se returnează obiectul amintire a emitentului. Obiectul memento în sine este un obiect opac (una care îngrijitorul nu poate, sau nu ar trebui, schimbare). La utilizarea acestui model, trebuie avut grijă în cazul în care Emitentul poate modifica alte obiecte sau resurse - modelul amintire funcționează pe un singur obiect.

19

Page 20: Sabloane de proiectare

Observer

20

Page 21: Sabloane de proiectare

State– Şablonul State descrie modul de implementare al unui obiect ce-şi poate schimba comportamentul la schimbarea stării lui interne.

21

Page 22: Sabloane de proiectare

Strategy 

Strategy – permite unei family de algoritmi sa fie selectat dynamic in timpul rularii.Sablonul Strategy se va aplica atunci cand:

- mai multe clase inrudite difera doar prin comportament; - sunt necesare mai multe variante ale unui algoritm, care difera intre ele, de exemplu, prin

compromisul spatiu-timp adoptat; - un algoritm utilizeaza date pe care clientul algoritmului nu trebuie sa le cunoasca; - intr-o clasa sunt definite mai multe actiuni care apar ca structuri conditionale multiple. In loc de

aceasta, se recomanda plasarea ramurilor conditionale inrudite in cate o clasa strategy separata.

SolutieIn figura de mai jos este data structura de clase care constituie sablonul Strategy:

Strategy: declara o interfata comuna pentru toti algoritmii acceptati. Context va utiliza aceasta interfata pentru a apela un anumit algoritm;

ConcreteStrategy: implementeaza un algoritm concret, utilizand interfata Strategy; Context: contine o referinta la Strategy, care va indica un obiect ConcreteStrategy;

clasa Context poate defini o interfata prin care sa laseStrategy sa-i acceseze datele;

Strategy si Context interactioneaza pentru a implementa un algoritm ales. Un obiect Context poate transmite spre Strategy toate datele necesare algoritmului, cand acesta este apelat; sau, obiectul Context se poate transmite pe sine insusi ca argument al operatiilor din Strategy. Obiectul Context dirijeaza cererile clientilor sai spre obiectul Strategy de care este legat. De regula, clientii creaza si paseaza spre Context obiecte de tip ConcreteStrategy, dupa care clientii vor interactiona doar cu Context. Consecinte Ierarhiile de clase Strategy definesc familii de algoritmi sau comportamente care pot fi reutilizate in diverse contexte. Mostenirea poate fi aplicata aici pentru a "factoriza" functionalitatile comune ale algoritmilor. Sablonul Strategy ofera o alternativa structurilor de control conditionale pentru selectia unui anumit comportament. Cand mai multi algoritmi sunt inglobati intr-o singura clasa, este greu sa se evite structurile conditionale. Adesea, prezenta in cod a numeroase asemenea structuri constituie un indiciu ca ar trebui aplicat sablonul Strategy. Clasele Strategy se pot utiliza si in cazul producerii de implementari diferite ale aceluiasi comportament, clientul putand sa opteze pentru una dintre ele, in functie de performantele dorite. Un dezavantaj al sablonului Strategy il consituie faptul ca, pentru a putea alege o anumita implementare sau un anumit algoritm, clientii trebuie sa stie care sunt ofertele si prin ce difera ele, una fata de alta. Acest lucru poate insemna in cele din urma ca un client sa trebuiasca sa cunoasca anumite detalii de implementare. De aceea, sablonul se va aplica doar in situatia in care diferentele relevante intre obiectele ConcreteStrategy se refera la comportamentul vizibil din perspectiva clientului.

22

Page 23: Sabloane de proiectare

Template Method

Template Method  - defineste un schilet al unui algoritm ca o clasa abstracta sa defineasca comportamentul concret.Sablonul Template Method se utilizeaza in urmatoarele situatii:

- pentru a implementa partile invariante ale unui algoritm o singura data, lasand subclaselor sarcina de a implementa partile care variaza; 

- cand partile comune ale unor subclase trebuie "scoase in factor comun" si localizate intr-o singura clasa, pentru a evita duplicarea de cod; acesta este un exemplu de "reproiectare in vederea generalizarii": mai intai se identifica diferentele din codul existent si apoi se constituie operatii noi cu diferentele respective, iar in final, codul se inlocuieste cu o metoda sablon care apeleaza una dintre operatiile noi; 

- pentru a controla extinderea subclaselor, si anume: se poate defini o metoda sablon care apeleaza asa-numite operatii-hook("carlige") in puncte specifice, permitand astfel ca extensiile sa se realizeze doar in acele puncte.

In figura de mai jos este data structura de clase care constituie sablonul Template Method:

AbstractClasso defineste operatiile primitive abstracte pe care subclasele urmeaza sa le implementeze;o implementeaza o metoda sablon care defineste scheletul unui algoritm. Aceasta metoda

apeleaza operatiile primitive si, eventual, alte operatii definite in AbstractClass sau in alte clase:

ConcreteClass  - implementeaza operatiile primitive pentru a realiza pasii specifici ai algoritmului definit de TemplateMethod.Consecinte

Metodele sablon reprezinta o tehnica fundamentala de reutilizare a codului. Ele au o importanta deosebita in cadrul bibliotecilor de clase, deoarece constituie un mijloc de factorizare a aspectelor comune ale comportamentului claselor respective.

Metodele sablon reprezinta o structura de control inversat, numita adesea "principiul Hollywood", adica: "Nu ne chema tu, ca te chemam noi". Aceasta inseamna ca o clasa parinte apeleaza operatiile unei subclase si nu invers.

23

Page 24: Sabloane de proiectare

Vizitor

Șablonul Vizitor descrie operația care trebuie să fie efectuată cu toate obiectele dintr-o structură. Șablonul dat ne permite să definim o operațiune nouă fără ca să modificăm clasele obiectelor date.Motivare

Deseori există un sistem deja creat ce funcționează foarte bine, doar că a venit timpul să efectuăm o anumită operație asupra obiectelor din sistem. Dar deoarece nu dorim ca să modificăm clasele cu adăugarea de noi metode, noi creăm un vizitor care va “vizita” toate obiectele din sistemul dat și va executa operația necesară fără a modifica măcar un simbol în codul claselor. Poate fi privit ca un instrument al hackerilor asupra structurii de obiecte.

24

Page 25: Sabloane de proiectare

25


Recommended