Sunteți pe pagina 1din 6

MINISTERUL EDUCAŢIEI, CULTURII și CERCETĂRII al REPUBLICII MOLDOVA

UNIVERSITATEA TEHNICĂ a MOLDOVEI


FACULTATEA CALCULATOARE, INFORMATICĂ și MICROELECTRONICĂ
DEPARTAMENTUL INGINERIA SOFTWARE și AUTOMATICĂ

RAPORT la lucrarea de laborator Nr. 2


Disciplina: Tehnici si Mecanisme de Proiectare Software
TEMA: Sablonul de proiectare BUILDER

Elaborat: st. gr. TI-171 Iepuras Daniel


Verficat: conf. univ. Scrob Sergiu

Chișinău – 2020
Definitie

Converteste interfața unei clase într-o altă interfață pe care o așteaptă clienții. Adapter
permite claselor să lucreze împreună, care altfel nu ar putea fi din cauza interfețelor
incompatibile.

Structura

Participanti

Target definește interfața specifică domeniului pe care o folosește Clientul.


Adapter adaptează interfața Adaptee la interfața țintă.
Adaptee definește o interfață existentă care trebuie adaptată.
Client colaborează cu obiecte prin intermediul interfetei țintă.

Realizare

Sa presupunem ca trebuie sa organizam un campionat si avem o interfata cu tipurile


de lupte posibile

interface Tournament{
public void fightKumite();
public void fightKata();
public void fightKataCoaches();
}
de asemenea avem clasa care realizeaza interfata data

class ChisinauTournament implements Tournament{

@Override
public void fightKumite(){
System.out.println("participants fighting KUMITE");
}

@Override
public void fightKata(){
System.out.println("participants fighting KATA");
}

@Override
public void fightKataCoaches(){
System.out.println("coaches fighting KATA");
}
}

Dupa cum putem observa, in campionatul nostru avem trei tipuri de lupte ,
participantii se lupta in tipul KUMITE, KATA si de asemenea antrenorii se lupta in
tipul KATA. Organizarea campionatului o ia Organizatorul Campionatului.

class TournamentOrganizer{
private Tournament tournament;
public TournamentOrganizer(Tournament tournament){
this.tournament = tournament;
}

public void startTournament(){


tournament.fightKumite();
tournament.fightKata();
tournament.fightKataCoaches();
}
}

In constructorul organizatorului campionatului noi transmitem obiectul campuinatului


creat si campionatul se produce in startTournament() in care noi apelam trei metode
realizate in clasa ChisinauTournament – fightKumit(), fightKata(),
fightKataCoaches();

public class Main{


public static void main(String[] args){
//сream obiectul Tournament
Tournament localTournament = new ChisinauTournament();
//cream obiectul tournamentOrganizer si ii transmitem obiectul localTournament
TournamentOrganizer tournamentOrganizer = new
TournamentOrganizer(localTournament);
//процессор управляет работой машины
tournamentOrganizer.startTournament();
Output:
participants fighting KUMITE
participants fighting KATA
coaches fighting KATA

Putem observa ca campionatul s-a organizat cu succes, dar s-a produs o probleme
cand am aflat ca in campionatul care trebuie organizat in Ukraina , antrenorii nu se
lupta intre ei , insa se vor lupta participantii intr-un alt tip de lupte – TEAM KATA.

class KievTournament implements TournamentUkraine{

@Override
public void fightKumite(){
System.out.println("participants fighting KUMITE");
}

@Override
public void fightKata(){
System.out.println("participants fighting KATA");
}

@Override
public void fightTeamKata(){
System.out.println("participants fighting TEAM KATA");
}
}

Dupa cum observam, metodele luptelor se diferentiaza si de asta avem doua variante –
de creat o noua clasa de organizare a campionatelor sau sa implementam sablonul
Adapter. Sigur ca vom folosi sablonul Adapter de aceasa cream clasa
TournamentAdapter.

class TournamentAdapter implements Tournament{


TournamentUkraine tournamentUkraine;

public TournamentAdapter(TournamentUkraine tournamentUkraine){


this.tournamentUkraine = tournamentUkraine;
}

@Override
public void fightKumite(){
tournamentUkraine.fightKumite();
}

@Override
public void fightKata(){
tournamentUkraine.fightKata();
}
@Override
public void fightKataCoaches(){
tournamentUkraine.fightTeamKata();
}
}

Clasa TournamentAdapter realizeaza interfata Campionatului de baza. Obiectul


adaptat (in cazul nostru campionatul organizat in Kiev) il transmitem in constructorul
clasei. Metoda fightKumite si fightKata sunt la fel ca si in campionatul de baza si in
campionatul din Kiev, de aceea noi apelam aceeasi metoda;
Asa cum in Kiev antrenorii nu se lupta intre ei atunci adapterul isi face lucrul –
apelam in metoda fightKataCoaches() metoda fightTeamKata();

In final obtinem

public class Main{


public static void main(String[] args){
//сream obiectul Tournament
Tournament localTournament = new ChisinauTournament();
//cream obiectul tournamentOrganizer si ii transmitem obiectul localTournament
TournamentOrganizer tournamentOrganizer = new
TournamentOrganizer(localTournament);
//процессор управляет работой машины
tournamentOrganizer.startTournament();

//cream adapterul si ii transmitem campionatul


TournamentAdapter ukraineTournament = new TournamentAdapter(new
KievTournament());
//cream organizatorul campionatului si ii transmitem adapterul
//создаем процессор и передаем в него адаптер
TournamentOrganizer tournamentOrganizerKiev = new
TournamentOrganizer(ukraineTournament);
//процессор управляет машиной
tournamentOrganizerKiev.startTournament();
}
}

Output:
participants fighting KUMITE
participants fighting KATA
coaches fighting KATA
participants fighting KUMITE
participants fighting KATA
participants fighting TEAM KATA
Dupa cum putem observa organizatorul campionatelor la fel apeleaza metoda
fightKataCoaches(), dar multumita clasei TournamentAdapter se apeleaza metoda
fightTeamKata() a clasei KievTournament.

Concluzie

In concluzie as vrea sa mentionez ca din punctul meu de vedere sablonul de proiectare


Adapter este unul dintre cele mai utile sabloane. El functiuneaza la fel ca un adapter
din viata reala si permita colaborarea a doua interfete incompatibile. Interfetele pot fi
incompatibile, dar functionalitatea interioara ar trebui sa se potriveasca nevoilor.
Schema de proiectare a adapterului permite ca clase incompatibile sa lucreze
impreuna transformand interfata unei clasa intr-o interfata asteptata de clienti.