Le pattern Proxy
Description
Le pattern Proxy a pour objectif la conception d’un objet qui se substitue à un autre objet (le sujet) et qui en contrôle l’accès.
L’objet qui effectue la substitution possède la même interface que le sujet, ce qui rend cette substitution transparente vis-à-vis des clients.
Exemple
Nous voulons offrir pour chaque véhicule du catalogue la possibilité de visualiser un film qui présente ce véhicule. Un clic sur la photo de la présentation du véhicule permet de jouer ce film.
Une page du catalogue contient de nombreux véhicules et il est très lourd de créer en mémoire tous les objets d’animation car les films nécessitent une grande quantité de mémoire et leur transfert au travers d’un réseau prend beaucoup de temps.
Le pattern Proxy offre une solution à ce problème en différant la création des sujets jusqu’au moment où le système a besoin d’eux, ici lors du clic sur la photo du véhicule.
Cette solution apporte deux avantages :
-
La page du catalogue est chargée beaucoup plus rapidement surtout si elle doit être chargée au travers d’un réseau comme Internet.
-
Seuls les films devant être visualisés sont créés, chargés et joués.
L’objet photo est appelé le proxy du film. Il se substitue au film pour l’affichage. Il procède à la création du sujet uniquement lors du clic. Il possède la même interface que l’objet film. La figure 3-8.1 montre le diagramme des classes correspondant. La classe du proxy, AnimationProxy, et la classe du film, Film, implantent...
Structure
1. Diagramme de classes
La figure 3-8.4 illustre la structure générique du pattern.
Figure 3-8.4 - Structure du pattern Proxy
Il convient de noter que les méthodes du proxy ont deux comportements possibles quand le sujet réel n’a pas été créé : soit elles créent le sujet réel puis lui déléguent le message (cas de la méthode clic de l’exemple), soit elles exécutent un code de substitution (cas de la méthode dessine de l’exemple).
2. Participants
Les participants au pattern sont les suivants :
-
Sujet (Animation) est l’interface commune au proxy et au sujet réel.
-
SujetRéel (Film) est l’objet que le proxy contrôle et représente.
-
Proxy (AnimationProxy) est l’objet qui se substitue au sujet réel. Il possède une interface identique à ce dernier (interface Sujet). Il est chargé de créer et de détruire le sujet réel et de lui déléguer les messages.
3. Collaborations
Le proxy reçoit les appels du client à la place du sujet réel. Quand il le juge approprié, il délégue ces messages au sujet réel. Il doit, dans ce cas, créer préalablement le sujet réel si ce n’est déjà fait.
Domaines d’application
Les proxys sont très utilisés en programmation par objets. Il existe différents types de proxy. Nous en illustrons trois :
-
Proxy virtuel : permet de créer un objet de taille importante au moment approprié.
-
Proxy remote : permet d’accéder à un objet s’exécutant dans un autre environnement. Ce type de proxy est mis en œuvre dans les systèmes d’objets distants (CORBA, Java RMI).
-
Proxy de protection : permet de sécuriser l’accès à un objet, par exemple par des techniques d’authentification.
Exemple en Java
Nous reprenons notre exemple en Java. Le code source de l’interface Animation est donné ci-dessous.
public interface Animation
{
void dessine();
void clic();
}
Le code Java de la classe Film qui implante cette interface se trouve à la suite. Dans le cadre de la simulation, chaque méthode affiche simplement un message à l’exception de la méthode clic qui n’a pas d’action.
public class Film implements Animation
{
public void clic(){}
public void dessine()
{
System.out.println("Affichage du film");
}
public void charge()
{
System.out.println("Chargement du film");
}
public void joue()
{
System.out.println("Lecture du film");
}
}
Le code source du proxy, donc de la classe AnimationProxy suit. Le code des méthodes correspond à celui spécifié dans le diagramme des classes de la figure 3-8.1.
public class AnimationProxy implements Animation
{
protected Film film = null;
protected String photo...