[DUMD 10/24] Le design pattern Adapter

Auteur du billet de blog : Nicolas Hilaire - Neotech Solutions

Nicolas Hilaire

Consultant .NET
  Publié le vendredi 25 novembre 2016

Artisan logiciel particulièrement intéressé par les technologies .NET. Polyvalent et curieux, je suis néanmoins à l'écoute des autres technologies du marché. MVP (Microsoft Most Valuable Professional) de 2007 à 2014, je suis également auteur d'un ouvrage pour apprendre le C#, à destination des débutants et de plusieurs MOOCs sur le C#, Windows Phone ou ASP.NET MVC...

Dixième billet sur comment devenir un meilleur développeur. Pour retrouver le sommaire ainsi que tous les liens, rendez-vous sur le premier billet.

 

Le pattern Adaptateur (Adapter en anglais) permet de convertir une interface en une autre interface dans le but d'interconnecter des classes qui seraient incompatibles sans ça.

On peut le comprendre très facilement en empruntant un exemple du monde réel : les adaptateurs de prise. Que ce soit pour brancher du 220 V sur du 110 ou pour charger une prise lightning avec une micro-usb, ou même encore pour passer de mini-SD à micro-SD, les adaptateurs sont monnaies courante. Ils nous permettent de transformer quelque chose qui est presque comme une autre chose, alors que ces choses ne peuvent pas directement fonctionner ensemble.

Prenons un rasoir acheté en France et fonctionnant sur du 220 V. Vous partez aux états-unis en voyage et vous ne pouvez pas brancher votre rasoir sur du 110 V, à moins de posséder une petite pièce que vous allez mettre entre la fiche française et la prise américaine, qui vous permettra d'adapter la fiche française dans la prise américaine.

Et bien ce design pattern, c'est exactement la même chose.

 

L'adaptateur en action

Imaginons que vous avez développé une killer-app qui contient une classe qui modélise une personne française :

 

 

Et puis un service qui permet d'afficher les détails de cette personne :

 

 

Tout se passe bien dans le meilleur des mondes, selon le code suivant :

 

 

Et puis votre logiciel grandit et on vous demande de travailler avec un partenaire qui a une bibliothèque où sont modélisés ses personnes à lui, qui sont anglaises :

 

 

Remarquez d'ailleurs comme ce partenaire ne sait pas faire d'encapsulation. Honte à lui ! ^^

Et vous l'aurez deviné, votre chef vous demande d'utiliser votre service pour afficher ces nouvelles personnes dignes d'intérêt. Elles se ressemblent quand même ces classes, ça ne doit pas être si compliqué...

Hop hop hop, ça doit clignoter maintenant dans votre tête de développeur. Adaptateur !

Il vous suffit de créer une classe qui va adapter un anglais en français, sachant que cette classe doit pouvoir être manipulée en tant que IPersonneFrancaise afin de pouvoir être utilisée dans le service.

Je crois que tout est dit :

 

 

Nous écrivons donc une classe qui accepte une IEnglishPersonne et qui se travestie en IPersonneFrancaise pour donner le change au service.

Il ne reste plus qu'à l'utiliser de cette façon :

 

 

Plutôt efficace ce pattern adapter. Grâce à lui, nous pouvons manipuler les anglais comme des français !

 

Conclusion

Le pattern adapter est un pattern très facile à comprendre et très facile à implémenter. Pourtant, il est d'une redoutable efficacité quand il s'agit de transformer une interface en une autre. Vous pourriez être tentés d'enlever les abstractions et de manipuler directement des classes concrètes. Mais vous avez déjà compris que c'était mal : programmez une interface et non une implémentation !

Le pattern adapter est très pratique lorsque l'on a l'habitude de travailler avec une bibliothèque tierce et qu'elle change d'interface suite à une montée de version. Ici, le pattern adapter vous permet d'exposer l'ancienne interface tout en travaillant avec la nouvelle. (au moins le temps d'un éventuel refactoring...)

Comme d'habitude, cherchez sur internet d'autres implémentations de ce design pattern afin de vous en faire une idée encore plus précise. Vous trouverez son diagramme de classe sur la page wikipedia, comme d'habitude. Regardez aussi cet exemple plutôt sympathique.

 

Prochain billet sur le design pattern Façade.

Commentaires