Télécharger la présentation
La présentation est en train de télécharger. S'il vous plaît, attendez
Publié parZoé Beguin Modifié depuis plus de 10 années
1
Proxy et plus Cnam Paris jean-michel Douin, douin au cnam point fr
Nouvelle version : 4 Septembre 2005 Notes de cours java : le langage : Introduction, approche impérative
2
Sommaire La famille Proxy Les Parents [Gof95] Les descendants
VirtualProxy RemoteProxy DynamicProxy
3
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
4
Objectifs Proxy-Procuration Alias Motivation
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 ...
5
realSubject->request();
Diagramme UML Subject request() … realSubject->request(); RealSubject request() … Proxy request() … realSubject L ’original
6
Une instance possible du pattern proxy
7
le Service/Sujet public interface Service{
offrir(Bouquet b) … public interface Service{ /** Offrir un bouquet de fleurs bouquet le bouquet réussite ou échec ... */ public boolean offrir(Bouquet b); }
8
Une implémentation du Service
ServiceImpl offrir(Bouquet b) … public class ServiceImpl implements Service{ public boolean offrir(Bouquet b){ System.out.println(" recevez ce bouquet : " + b); return true; }
9
Offrir en « direct » Client offrir(unBouquet) Console...
Service service = new ServiceImpl(); assert service.offrir(unBouquet) == true;
10
Le mandataire public class ServiceProxy implements Service{
service.offrir(b) 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) …
11
Offrir par l ’intermédiaire de
ServiceProxy Console ... Client offrir(unBouquet) offrir(unBouquet) Service service = new ServiceProxy(); service.offrir(unBouquet);
12
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
13
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; }
14
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;
15
La « famille » avec BlueJ
16
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(" Class classe = Class.forName("ServiceImpl",true, classLoader); service = (Service) classe.newInstance(); }catch(Exception e){ e.printStackTrace(); } return service;
17
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 » ?
18
un cousin plutôt dynamique et standard
extrait de l ’API du J2SE Dynamic Proxy 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
19
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);
20
Dynamic Proxy Client Console ... Proxy InvocationHandler
offrir(unBouquet) invoke(service,args) invoke() ClassLoader cl = Service.class.getClassLoader(); Service service = (Service) Proxy.newProxyInstance(cl, new Class[]{Service.class}, new DynamicEtProxy()); service.offrir(unBouquet);
21
Doit-on connaître le nom de la classe ?
VirtualProxyBis, le retour ClassLoader cl = new URLClassLoader( new URL[]{new URL(" 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 ?
22
DynamicProxy et le pattern décorateur
23
Le petit dernier Une procuration à distance
24
un petit dernier
26
Java RMI utilise les DynamicProxy
appel distant transparents génération des « stubs »
27
Pourquoi
28
Exemple
Présentations similaires
© 2024 SlidePlayer.fr Inc.
All rights reserved.