Proxy
Alte nume: Surrogate
Proprietati
Tip: Structural
Nivel: Componenta
Scop
Ofera un reprezentant al altui obiect pentru motive precum accesul, viteza, sau securitatea.
Introducere
PIM trebuie sa gestioneze multe īntālniri si date. Cartea de adrese contine adresele persoanelor cu care v-ati īntālnit sau cu care ati avut un contact de natura profesionala, inclusiv date despre familiile, hobby-urile, sau alte informatii ce se pot dovedi folositoare īntr-un anume context. La īnceput numarul de persoane este mic, dar se poate ajunge la mii de īnregistrari.
Īn multe cazuri, PIM se foloseste numai pentru a modifica timpul unei īntālniri, pentru a face o nota des 18418y2416s pre ceva (sa cumperi flori, de exemplu) sau o alta actiune la fel de simpla. Prezentarea īntregului obiect carte de adrese se dovedeste nenecesara si chiar stānjenitoare īn aceste situatii. Doar deschiderea cartii de adrese este o operatie costisitoare, īncetinind fara rost activitati ce nu necesita folosirea ei.
Ca utilizator al PIM, doresti ca sa ai la dispozitie cartea de adrese atunci cānd ai nevoie de ea. (Ideal ar fi ca sa-ti fie la dispozitie chiar īnainte de a o folosi). De exemplu, doresti sa stii cāte īnregistrari ai īn cartea de adrese sau doresti sa adaugi o noua īnregistrare fara a fi nevoit sa editezi toate cāmpurile acesteia. Ai nevoie, cu alte cuvinte, doar de parti (mici) ale cartii de adrese.
Solutia īn astfel de situatii este un obiect "marcator, placeholder" care furnizeaza o interfata la īntreaga carte de adrese sau la o parte a acesteia. Obiectul marcator arata ca si cartea de adrese, dar nu implica īncarcarea necesara executiei acesteia. Desigur, cānd ai nevoie de īntreaga carte de adrese pentru sarcini precum actualizarea adresei unei persoane, obiectul marcator va crea cartea de adrese reala, pentru a executa metodele obiectului carte de adrese. Acest obiect marcator este un Proxy.
Aplicabilitate
sablonul Proxy se foloseste cānd se doreste o referinta mai elaborata la un obiect īn locul uneia obisnuite:
Proxy la distanta Remote proxy - Cānd este nevoie de un reprezentant local pentru un obiect dintr-un alt spatiu de adrese (JVM).
Proxy virtual Virtual proxy - Actioneaza ca un marcator si īntārzie crearea obiectelor costisitoare (Aceasta este versiunea descrisa īn sectiunea Introducere).
Proxy de protectie Protection proxy - Determina drepturile de acces la obiectul real.
Descriere
Obiectul proxy (sau stub) este un reprezentant pentru un alt obiect. Pentru a-i permite sa reprezinte obiectul real, obiectul proxy trebuie sa implementeze exact aceeasi interfata ca si obiectul real. Mai mult, obiectul proxy pastreaza o referinta la obiectul real. El are nevoie de aceasta referinta pentru a apela, la nevoie, metodele obiectului real. Clientii interactioneaza cu obiectul proxy, iar acesta poate delega executia la obiectul real. Obiectul proxy implementeaza aceeasi interfata ca si obiectul real, īnsa poate executa sarcini pe care nu le executa obiectul real, precum comunicare la distanta sau securitate.
Obiectul proxy este un fel de īnlocuitor pentru obiectul real. sablonul Proxy se poate compara cu un sistem de filmare a cascadoriilor periculoase pentru filmele de actiune. Obiectul Proxy este cascadorul, dublura obiectului real, steaua de cinema. Pe perioada cascadoriilor periculoase, obiectul Proxy sare din avion īn locul obiectului real. Deoarece obiectul Proxy implementeaza aceeasi interfata ca si obiectul real, spectatorii nu pot sesiza diferenta, si cred ca a sarit obiectul real. Īnsa cānd camera de filmat comuta pe un prim cadru, de aproape (cānd este nevoie de obiectul real pentru īnsusirile sale), obiectul Proxy face apel la obiectul real pentru a-si juca rolul.
Diversele tipuri de proxy au diverse reguli de functionare
La distanta Remote - Proxy-ul la distanta este responsabil pentru toata hīrtogaria cu reteaua. El trebuie sa efectueze marshalling-ul (īnpachetarea) si unmarshalling-ul (despachetarea) tuturor argumentelor trimise si receptionate.
Virtual - Obiectul real este foarte costisitor de creat, deci se amāna crearea lui cāt de mult este posibil, sau crearea se efectueaza treptat (a piece at a time), iar nu dintr-o data (all at once). Daca obiectul Proxy pastreaza o multime de informatii despre subiectul real, nu este nevoie sa se instantieze obiectul real pentru a accesa respectiva informatie.
Protectie Protection - sablonul Proxy de protectie se poate folosi pentru a controla cine ce metoda acceseaza si pentru a da permisiuni pe o metoda la nivelul apelatorilor individuali.
Implementare
Diagrama de clase a sablonului Proxy este
prezentata īn Figura 1
Figura 1. Diagrama de clase a sablonului Proxy
Pentru implementarea sablonului Proxy, este nevoie de urmatoarele:
Service - Interfata implementata atāt de proxy, cāt si de obiectul real.
ServiceProxy - Clasa care implementeaza interfata Service si redirectioneaza apelurile de metode spre obiectul real (ServiceImpl) cānd este cazul.
ServiceImpl - Clasa obiectului real, implementare completa a interfetei. Instanta acestei clase este reprezentata de obiectul Proxy
Avantaje si dezavantaje
Consecintele acestui sablon variaza considerabil īn functie de tipul specific de proxy.
Remote proxy - Avantajul sablonului remote proxy este ca se ascunde reteaua pentru client. Clientul crede ca el dispune de un obiect local care face activitatea ceruta. De fapt, el are un obiect local care trimite cererea īn retea pentru a executa activitatea dorita. Un dezavantaj potential al acestuia este ca daca nu se ia īn considerare reteaua, clientul s-ar putea sa nu fie pregatit pentru penalizarile de timp rezultate din folosirea acesteia.
Virtual proxy - Marele avantaj al folosirii acestuia este ca se dispune de un marcator cu care sa se interactioneze si ca nu este nevoie sa se creeze produsul real pāna nu este nevoie cu adevarat de el. Mai mult, obiectul Proxy virtual poate efectua anumite optimizari privitoare la cānd si cum se creeaza obiectul real.
Protection proxy - Avantajul acestuia este ca permite controlul accesului utilizatorilor la metodele obiectului real.
Variatiuni la acest sablon
O varianta a acestui sablon este atunci cānd proxy nu cunoaste obiectul real decāt prin interfata acestuia. Aceasta varianta induce o mai mare flexibilitate dar functioneaza numai daca proxy-ul nu este responsabil pentru crearea si/sau distrugerea obiectului real.
sabloane īnrudite
Adapter - sablonul Adapter furnizeaza o interfata de fatada pentru un obiect specific, ca si sablonul Proxy. Deosebirea consta īn aceea ca Proxy furnizeaza aceeasi interfata, pe cānd Adapter furnizeaza o interfata diferita.
HOPP - sablonul HOPP poate folosi sablonul Proxy pentru comunicarea īntre cele doua jumatati distribuite ale sablonului HOPP.
Business Delegate [CJ2EEP] - sablonul Business Delegate se poate folosi ca sablon Proxy. Obiectul Business Delegate poate fi un reprezentant local al nivelului Business (tier).
Exemplu
Cartea de adrese din PIM creste considerabil īntr-o perioada de timp, deoarece ea memoreaza toate contactele profesionale si sociale. Totusi, utilizatorul nu are nevoie īntotdeauna de īntreaga carte de adrese cānd foloseste PIM. El are nevoie doar de un fel de marcaj pe cartea de adrese pe post de punct de plecare pentru anumite operatii. Exemplul de fata foloseste sablonul Proxy pentru a reprezenta cartea de adrese.
AddressBook defineste interfata pentru accesarea cartii de adrese a PIM. Minimal, ea trebuie sa aiba abilitatea de a adauga contacte (īnregistrari) noi si de a regasi si memora adrese.
Exemplul 1 AddressBook.java
1. import java.io.IOException;
2. import java.util.ArrayList;
3. public interface AddressBook
Regasirea datelor din cartea de adrese ar putea fi o operatie consumatoare de timp. Prin urmare, obiectul proxy trebuie sa īntārzie crearea cartii de adrese reale cāt mai mult posibil. Obiectul proxy, reprezentat de AddressBookProxy, are responsabilitatea crearii cartii de adrese - dar numai cānd este imperios necesara existenta acesteia.
Exemplul 2 AddressBookProxy.java
1. import java.io.File;
2. import java.io.IOException;
3. import java.util.ArrayList;
4. import java.util.Iterator;
5. public class AddressBookProxy implements AddressBook
public void open()
}
public void save() else if (!localAddresses.isEmpty())
}
public ArrayList getAllAddresses()
return addressBook.getAllAddresses();
}
public Address getAddress(String description)
}
}
if (addressBook == null)
return addressBook.getAddress(description);
}
public void add(Address address) else if (!localAddresses.contains(address))
}
Sa observam ca obiectul AddressBookProxy are propriul sau tablou ArrayList pentru adrese. Daca utilizatorul adauga o adresa prin apelarea metodei add, obiectul proxy poate folosi cartea de adrese interna a sa fara a folosi cartea de adrese reala.
Clasa AddressBookImpl reprezinta cartea de adrese reala a unui utilizator. Ea este asociata cu un fisier care memoreaza un tablou ArrayList cu toate adresele persoanelor. Obiectul AddressBookProxy ba crea un obiect AddressBookImpl numai la nevoie - de exemplu cānd un utilizator a apelat metoda getAllAddresses
Exemplul 3 AddressBookImpl.java
1. import java.io.File;
2. import java.io.IOException;
3. import java.util.ArrayList;
4. import java.util.Iterator;
5. public class AddressBookImpl implements AddressBook
public ArrayList getAllAddresses()
public Address getAddress(String description)
}
return null;
}
public void add(Address address)
}
public void open()
public void save()
|