Nouvelles Chroniques d'Amethyste

Penser au Sens, pas au Verbe

Comparaison des patrons Proxy, Adaptateur et façade

Poster un commentaire

Le patron Proxy (Proxy Pattern) est très important et très courant. Il est notamment le chef d’orchestre des architectures distribuées qui deviennent peu à peu la norme sous l’influence de la mobilité en particulier. Il est donc important de le comprendre.

Un proxy est une classe utilisée à la place d’une autre classe appelée classe réelle. Le cas le plus fréquent est toutefois celui où la classe réelle est un service. Le proxy est la classe client qui agira à la place de celle-ci. Mais d’une façon générale toute abstraction implémente un patron proxy. Par exemple la classe FileStream est un proxy pour un fichier.

Graphiquement ce pattern est représenté ainsi:

2014-07-02_21-13-21

Une classe client consomme une instance d’une interface IProxy décrivant l’interface d’une classe réelle appelée ClasseReelle. En réalité le client ne va pas recevoir l’instance de ClasseReelle, mais une instance d’une autre classe Proxy qui implémente également IProxy. Proxy agit donc à la place de ClasseReelle.

En interne Proxy va peut être instancier ClasseReelle ou bien se connecter à ClasseReelle via un service web ou tout ce que l’on peut imaginer.

Jusque là tout paraît clair, tout au plus peut t’on se demander pourquoi ClasseReelle devrait implémenter IProxy.

Peut être avez vous vu le film Apollo 13 avec une scène célèbre où des ingénieurs cherche à faire rentrer un tuyau carré dans un tuyau rond? Ils y arrivent tout simplement en créant ce qu’en informatique on appelle un adaptateur entre les deux tuyau.

On pourrait représenter les choses ainsi:

2014-07-02_21-28-19

Cela s’appelle patron adaptateur (Pattern adapter).

Si vous comparez les deux diagrammes vous devriez constater une certaine similitude. Il ne semble pas évident que les codes produits soient très différents si ce n’est les noms utilisés.

Alors pourquoi distinguer ces deux patrons?

 

En réalité le problème n’est qu’apparent et inhérent au seul code et schéma. Ce que formalise un patron ce n’est pas cela, mais plutôt un concept. On doit donc s’intéresser non pas au code ou aux diagrammes, mais à l’intention derrière chaque patron.

Un adaptateur a pour seule vocation de changer l’interface d’une classe, pas son comportement. En d’autres termes Adaptateur fournit au client l’interface qu’il s’attend à trouver quelle que soit la classe réelle.
Ce pattern permet d’appliquer le polymorphisme à des classes structurellement différentes.

Le proxy propose plutôt une classe de substitution lorsque la classe réelle n’est pas directement utilisable. Proxy va peut être affecter le comportement, mais pas l’interface. C’est pourquoi on demande à la classe réelle d’implémenter aussi l’interface IProxy.

 

Essayons de poursuivre cette discussion avec un troisième patron: la façade (Pattern Facade). C’est lui aussi un patron de structure. Voici un exemple inspiré d’ici:

http://www.netobjectivestest.com/PatternRepository/index.php?title=TheFacadePattern

2014-07-02_22-19-13

Un hôtel peut proposer divers services. En général ce n’est pas au client de s’en occuper, il s’adresse à l’accueil et le concierge s’en occupe pour lui. Le concierge est pour le client une interface pour accéder à un certain nombre de services complexes. C’est exactement cela le patron façade.

 

Ce faisant on voit bien que le diagramme de ce patron n’est pas très différent du patron adaptateur, voir même du proxy. Pourquoi ne pas l’appeler adaptateur d’ailleurs?

Pour les même raisons que précédemment. Ce n’est ni le diagramme, ni le code qui fait le patron, mais son intention.

 

La façade cherche à simplifier une interface, pas le proxy, ni l’adaptateur. La façade peut même choisir de n’exposer qu’une partie des services sous-jacents. L’intention est clairement de simplifier quelque chose.

 

Voilà, j’espère que certaines choses sont plus claires. On a pas vu de code, mais pour cela je vous renvoie vers ce site qui fera les choses très bien:

http://www.dofactory.com/Patterns/Patterns.aspx

 

 

 

 

 

 

 

Publicités

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s