Proxy

Autres noms : Surrogate (= substitution), Placeholder (= objet de substitution)
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 : Présentation classique (gof) : Proxy A l'exécution : Proxy Pour pouvoir substituer l'objet caché par le proxy, les deux implémentrent la même interface.
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".