Upload
zoe-beguin
View
114
Download
3
Embed Size (px)
Citation preview
NSY1021
Proxy et plus
Notes de cours java : le langage : Introduction, approche impérative
Cnam Parisjean-michel Douin, douin au cnam point fr
Nouvelle version : 4 Septembre 2005
NSY1022
Sommaire
• La famille Proxy– Les Parents [Gof95]
– Les descendants• VirtualProxy• RemoteProxy• DynamicProxy
NSY1023
Bibliographie utilisée
• Design Patterns, catalogue de modèles de conception réutilisables
de Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides [Gof95]International thomson publishing France
Mark Grand
• http://www.ida.liu.se/~uweas/Lectures/DesignPatterns01/panas-pattern-hatching.ppt
• http://www.mindspring.com/~mgrand/pattern_synopses.htm
NSY1024
Objectifs
• Proxy-Procuration– Fournit à un tiers objet un mandataire, pour contrôler l ’accès à cet objet
• Alias– Subrogé (surrogate)
• Motivation– contrôler– différer– optimiser– sécuriser– ...
NSY1025
Diagramme UML
– L ’original
Subject
request()…
RealSubject
request()…
Proxy
request()…
realSubject
realSubject->request();
NSY1026
Une instance possible du pattern proxy
• http://www.theserverside.com/tt/articles/content/JIApresentations/Kabutz.pdf
NSY1027
le Service/Sujet
public interface Service{
/** Offrir un bouquet de fleurs
* @param bouquet le bouquet
* @return réussite ou échec ...
*/
public boolean offrir(Bouquet b);
}
Service
offrir(Bouquet b)…
NSY1028
Une implémentation du Service
public class ServiceImpl implements Service{
public boolean offrir(Bouquet b){
System.out.println(" recevez ce bouquet : " + b);
return true;
}
}
ServiceImpl
offrir(Bouquet b)…
NSY1029
Offrir en « direct »
Service service = new ServiceImpl();
assert service.offrir(unBouquet) == true;
Client Console...offrir(unBouquet)
NSY10210
Le mandataire
public class ServiceProxy implements Service{
private ServiceImpl service;
public ServiceProxy(){
this.service = new ServiceImpl();
}
public boolean offrir(Bouquet bouquet){
boolean résultat;
System.out.print(" par procuration : ");
résultat = service.offrir(bouquet);
return résultat;
} }
ServiceProxy
offrir(Bouquet b)…
service.offrir(b)
NSY10211
Offrir par l ’intermédiaire de
Service service = new ServiceProxy();
service.offrir(unBouquet);
Client Console ...offrir(unBouquet) offrir(unBouquet)
ServiceProxy
NSY10212
VirtualProxy
• Création d ’objets « lourds » à la demande
– Coût de la création d ’une instance– Création d ’un objet seulement si nécessaire
NSY10213
Virtual (lazy) Proxy
public class VirtualProxy implements Service{
private Service service;
public boolean offrir(Bouquet bouquet){
boolean résultat;
System.out.print(" par procuration, virtualProxy (lazy) : ");
Service service = getServiceImpl();
résultat = service.offrir(bouquet);
return résultat;
}
NSY10214
VirtualProxy & Introspection
private Service getServiceImpl(){
if(service==null){
try{
Class classe = Class.forName("ServiceImpl");
service = (Service) classe.newInstance();
}catch(Exception e){
e.printStackTrace();
}
}
return service;
}
NSY10215
La « famille » avec BlueJ
NSY10216
Sécurité … VirtualProxy bis
• URLClassLoader hérite de SecureClassLoader– Il peut servir à « vérifier » un code avant son exécution– souvent associé à une stratégie de sécurité
private Service getServiceImpl(){
if(service==null){
try{
ClassLoader classLoader = new URLClassLoader( new URL[]{new URL("http://jfod.cnam.fr/nsy102/proxy_pattern.jar")});
Class classe = Class.forName("ServiceImpl",true, classLoader); service = (Service) classe.newInstance();
}catch(Exception e){
e.printStackTrace();
}
}
return service;
}
NSY10217
Résumé, bilan intermédiaire
• Procuration à un tiers– Proxy
• contrôle complet de l ’accès au sujet réel
– VirtualProxy• des contraintes de coûts en temps d ’exécution• liée à une stratégie de sécurité
– ? Connaissance à l ’exécution du sujet réel ?
– ? Procuration pour un appel distant en complète « transparence » ?
NSY10218
un cousin plutôt dynamique et standard
• extrait de l ’API du J2SE Dynamic Proxy• http://java.sun.com/j2se/1.5.0/docs/api/java/lang/reflect/InvocationHandler.html• http://java.sun.com/j2se/1.5.0/docs/api/java/lang/reflect/Proxy.html
– L ’interface à implémenter
interface java.lang.reflect.InvocationHandler;
– ne contient qu ’une seule méthode
Object invoke( Object proxy, Method m, Object[] args);
• proxy : le contexte de l ’appelé, XXXClassLoader• m : la méthode sélectionnée• args : les arguments de cette méthode
NSY10219
DynamicEtProxy
public class DynamicEtProxy implements InvocationHandler{
private ServiceImpl service;
public DynamicEtProxy(){
this.service = new ServiceImpl();
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Exception{
System.out.print(" par procuration dynamique : ");
return method.invoke(service, args);
}
}
NSY10220
Dynamic Proxy
ClassLoader cl = Service.class.getClassLoader();
Service service = (Service) Proxy.newProxyInstance(cl, new Class[]{Service.class},
new DynamicEtProxy());
service.offrir(unBouquet);
Client Console ...offrir(unBouquet)
Proxy
invoke() invoke(service,args)
InvocationHandler
NSY10221
Doit-on connaître le nom de la classe ?
• VirtualProxyBis, le retour
ClassLoader cl = new URLClassLoader( new URL[]{new URL("http://jfod.cnam.fr/csiml/proxy_pattern.jar")});
Class classe = Class.forName("DynamicEtProxy",true, cl);
InvocationHandler handler = (InvocationHandler)classe.newInstance();
Service service = (Service) Proxy.newProxyInstance(cl,
new Class[]{Service.class},
handler);
service.offrir(unBouquet);
}
• encore plus dynamique ? Plus générique ?
NSY10222
DynamicProxy et le pattern décorateur
NSY10223
Le petit dernier
• Une procuration à distance
NSY10224
un petit dernier
• http://www.mindspring.com/~mgrand/pattern_synopses.htm
NSY10225
NSY10226
Java RMI utilise les DynamicProxy
• appel distant transparents• génération des « stubs »
NSY10227
Pourquoi
NSY10228
Exemple
NSY10229
NSY10230
NSY10231