Documente Academic
Documente Profesional
Documente Cultură
RAPORT
Lucrare de laborator Nr. 2
la disciplina "Ingineria Produselor Program"
Tema: Șabloane structurale
Chișinău 2017
Scopul Lucrării: De studiat și de implementat 5 șabloane structurale la alegere.
În acest caz clasa ShapePainter are nevoie de a desena o figură prin precizarea punctelor
inițiale și a dimensiunii figurii, iar adaptorul – PainterAdaptor permite utilizarea unei clase ce
desenează figuri folosind punctele inițiale și finale a figurii.
1
Figura 2. Diagrama claselor a șablonului Bridge
În acest exemplu a fost separată logarea de computare ceea ce permite instanțelor clasei
Computation să utilizeze diferite implementări a logării – ConsoleLogger sau FileLogger.
Diferența dintre Adapter și Bridge este că Adaptorul este utilizat pentru a conecta entități deja
existente incompatibile, iar Bridge soluționează separarea abstracțiilor ce trebuie implementate.
2
Figura 3. Diagrama claselor a șablonului Decorator
Acest șablon este format din un tip Component și un tip Decorator, ce au aceleași interfață.
Decoratorul are o instanță a clasei Component, iar datorită implementării aceleiași interfețe,
ambele pot fi utilizate în aceleași locuri. Decoratorul însă mai poate adăuga responsabilități la
instanța pe care o încapsulează.
3
Figura 4. Diagrama claselor a șablonului Facade
În exemplul dat interfața fațadei expune doar anumite metode a claselor ce le încapsulează.
Clientul, în cazul dat, nu cunoaște care clase implementează metodele ce le apelează, și nu ține
legătura directă cu clasele subsistemului. Astfel se reduc dependențele între aceștia obținându-se
o cuplare slabă.
4
Figura 5. Diagrama claselor a șablonului Proxy
5
Concluzii
În urma efectuării acestei lucrări au fost studiate cinci șabloanele structurale și s-a încercat
implementarea acestor șabloane.
Șablonul Adapter prezintă o soluție de a interconecta două interfețe existente. Aceasta se
realizează prin utilizarea unei clase adiționale ce implementează interfața necesară clientului și
utilizează o instanță a interfeței incompatibilă. Aceasta rezolvă problema incompatibilității fără a
modifica clasele existente.
Șablonul Bridge este utilizat în cazul în care este necesară separarea abstracțiilor de
implementări. Aceasta permite definirea unei implementări independente, ce poate fi aleasă în
timpul rulării.
Diferența dintre Bridge și Adapter este că Adapter interconectează abstracții existente
incompatibile, iar Bridge prezintă soluții pentru a obține abstracții separate independente.
Șablonul Decorator este utilizat la necesitatea adăugării a mai multor funcționalități unui
obiect, în mod dinamic, în timpul rulării. Aceasta se realizează prin compoziția obiectelor cu
aceeași interfață ca subiect, iar cu fiecare compunere sunt adăugate funcționalități noi.
Destinația șablonului Facade este de a simplifica un sistem complex, prin încapsularea
acestuia cu o singură clasă, care expune doare o interfață simplă cu doar metodele necesare
clientului. Astfel clientul nu cunoaște fiecare clasă a subsistemului ci doar fațada ei. Acest șablon
duce la obținerea cuplărilor minime.
Șablonul Proxy are ca scop rezolvarea problemelor ca restricționarea accesului la un anumit
obiect, sau adăugarea funcționalului nou acestuia. Acesta este realizat cu ajutorul unei clase
surogat ce se utilizează în locul subiectului real, și adaugă funcțional nou lui. Există trei tipuri de
proxy: remote - ce are ca scop permiterea accesului la un obiect distant; virtual – ca înlocțiito a
unui obiect complex, ce poate fi încărcat greu; protection – ce premite limitarea accesului la
subiect.
Șabloanele structurale prezintă metode de a rezolva probleme ce pot apărea la relații între
entități prin specificarea modului de acces și cunoaștere între entități.
6
Anexa A
Codul sursă a implementării șablonului Adapter
class Program
{
static void Main(string[] args)
{
var painter = new ShapePainter(new PainterAdapter());
Console.ReadKey();
}
}
7
Anexa A
Codul sursă a implementării șablonului Bridge
class Program
{
static void Main(string[] args)
{
IComputation computation = new Computation(new ConsoleLogger());
computation.Compute();
Console.ReadKey();
}
}
void Compute();
}
8
Anexa A
Codul sursă a implementării șablonului Decorator
class Program
{
static void Main(string[] args)
{
var k = new KeyComponent('K');
Console.WriteLine(k);
k = new ShiftKeyDecorator(k);
Console.WriteLine(k);
k = new CtrlKeyDecorator(k);
Console.WriteLine(k);
k = ((KeyDecorator)k).Undecorated;
Console.WriteLine(k);
Console.ReadKey();
}
}
9
{
_component = component;
}
}
10
Anexa A
Codul sursă a implementării șablonului Facade
class Program
{
static void Main(string[] args)
{
IImageProcessorFacade facade = new ImageProcessorFacade();
facade.ApplyBlackWhite();
facade.ApplySepia();
facade.Rotate(90);
facade.DrawShape();
facade.DrawText("LABEL TEXT");
Console.ReadKey();
}
}
11
}
}
12
Anexa A
Codul sursă a implementării șablonului Proxy
class Program
{
static void Main(string[] args)
{
var worldMap = new WorldMap(new ProxyMap());
worldMap.Draw();
Console.ReadKey();
}
}
13