But : cacher un objet en fournissant un objet de substitution.
Le code client n'accède à l'objet caché que par le biais du proxy.
Plusieurs raisons peuvent amener à écrire un proxy :
-
Virtual proxy : pour éviter la création d'objets "chers" (lourds) tant qu'ils ne sont pas vraiment utilisés (lazy loading).
L'objet lourd est caché derrière le proxy ; le code client pourra créer le proxy à n'importe quel moment (à l'initialisation par exemple).
Le proxy créera l'objet caché que lorsqu'il sera vraiment utilisé. -
Remote proxy (remote = distant) : fournit un représentant local d'un objet distant (dans un autre processus ou situé sur une autre machine)
Utilisé par Corba ou RPC ("stub").
Ce type de proxy est parfois appelé Ambassador. - Protection proxy : pour contrôler l'accès à l'objet caché. Lorsque des droits d'accès différents permettent d'accéder à certaines fonctionnalités de l'objet caché.
-
Smart proxy : le proxy effectue des actions supplémentaires chaque fois qu'un objet est utilisé, par exemple :
- Compter le nombre de fois que l'objet caché est utilisé (par exemple pour du garbage collection).
- Mettre un verrou sur l'objet caché pour interdire à d'autre code de le modifier.
- Stocker l'objet sur disque la première fois qu'il est utilisé.
Le proxy a une variable d'instance de type
RealSubject
, de manière à pouvoir forwarder request()
.
Exemples
Exemple courant de virtual proxy :Dans un ORM, on a les classes
Livre
et Auteur
qui représentent des données stockées dans les tables livres
et auteurs
.
Lorsqu'on fait dans le code :
Livre livre = new Livre(123);L'ORM ne renvoie pas un objet Livre, mais un proxy vers Livre.
Le livre n'est effectivement lu en base de données que lorsqu'on utilise vraiment ses données, par ex avec :
String titre = livre.getTitre(); Auteur auteur = livre.getAuteur(); Livre[] livres = auteur.getLivres();
Exercice : Protection proxy (classe sensible)
Exercice : Virtual proxy (création de gros objet)
Remarques
Pattern assez proche de Adapter et Decorator, mais :- Adapter fournit une interface différente de l'objet qu'il adapte, ce n'est généralement pas le cas pour proxy.
- Decorator et Proxy ne répondent pas au même but : Decorator ajoute des fonctionnalités, Proxy contrôle un accès.
Façade poursuit un but similaire, mais sans interdire l'accès aux objets qu'il "cache".