Adaptateur (patron de conception) - Définition

Source: Wikipédia sous licence CC-BY-SA 3.0.
La liste des auteurs de cet article est disponible ici.

Introduction

En génie logiciel, Adaptateur est un patron de conception (design pattern) de type structure (structural).

But

Il permet de convertir l'interface d'une classe en une autre interface que le client attend. Adaptateur fait fonctionner un ensemble des classes qui n'auraient pas pu fonctionner sans lui, à cause d'une incompatibilité d'interfaces.

Motivation / Exemple

Vous voulez intégrer une classe que vous ne voulez/pouvez pas modifier.

Structure

Schéma UML du motif de conception Adaptateur

Applicabilité

  • Une API Tiers convient à votre besoin fonctionnel, mais la signature de ses méthodes ne vous convient pas.
  • Vous voulez normaliser l'utilisation d'anciennes classes sans pour autant en reprendre tout le code.

Participants

  • IAdaptateur : Définit l'interface métier utilisée par le Client.
  • Client : Travaille avec des objets implémentant l'interface IAdaptateur.
  • Adapté : Définit une interface existante devant être adaptée.
  • Adaptateur : Fait correspondre l'interface de Adapté à l'interface IAdaptateur.

Conséquences

Un objet Adaptateur sert de liaison entre les objets manipulés et un programme les utilisant, à simplifier la communication entre deux classes. Il est utilisé pour modifier l'interface d'un objet vers une autre interface.

Exemple en C#

      ///  la signature "IAdaptateur" utilisée par le client       public interface IDeveloppeur {          ///   Requete           string EcrireCode();      }             ///  concrétisation normale de "IAdaptateur" par une classe       class DeveloppeurLambda : IDeveloppeur {          public string EcrireCode() {               return "main = putStrLn \"Algorithme codé\"";           }      }             ///  "Adapté" qui n'a pas la signature "IAdaptateur"       class Architecte {          public string EcrireAlgorithme() {               return "Algorithme";          }      }             ///  "Adaptateur" qui encapsule un objet qui n'a pas la bonne signature      class Adaptateur : IDeveloppeur {          Architecte _adapté;          public Adaptateur (Architecte adapté) {              _adapté = adapté;          }          public string EcrireCode() {              string algorithme = _adapté.EcrireAlgorithme();              return string.Format("let main() = printfn \"{0} codé\"", algorithme);          }      }             //___________________________________________________________________      // Implémentation             ///  "Client" qui n'utilise que les objets qui respectent la signature       class Client {          void Utiliser(IDeveloppeur cible) {              string code = cible.EcrireCode();              Console.WriteLine(code);          }          static void Main() {              var client = new Client();                     IDeveloppeur cible1 = new DeveloppeurLambda();              client.Utiliser(cible1);                     var adapté = new Architecte();              IDeveloppeur cible2 = new Adaptateur(adapté);              client.Utiliser(cible2);          }      }      

Exemple en C++

Un adaptateur pour faire un carré aux coins ronds. Le code est en C++.

      class Carre{        public:          Carre();          virtual dessineCarre();          virtual Coordonnees* getQuatreCoins();      };             class Cercle{        public:          Cercle();          virtual dessineCercle();          virtual void setArc1(Coordonnees* c1);          virtual void setArc2(Coordonnees* c2);          virtual void setArc3(Coordonnees* c3);          virtual void setArc4(Coordonnees* c4);          virtual coordonnees* getCoordonneesArc();      };             class CarreCoinsRondAdapter: public Carre, private Cercle{        public:          CarreCoinsRondAdapter();          virtual void dessineCarre(){             setArc1(new Coordonnees(0,0));             setArc2(new Coordonnees(4,0));             setArc3(new Coordonnees(4,4));             setArc4(new Coordonnees(0,4));             // Fonction qui dessine les lignes entre les arcs             dessineCercle();          }          virtual Coordonnees* getQuatreCoins(){             return getCoordonneesArc();          }      };      
Page générée en 0.086 seconde(s) - site hébergé chez Contabo
Ce site fait l'objet d'une déclaration à la CNIL sous le numéro de dossier 1037632
A propos - Informations légales
Version anglaise | Version allemande | Version espagnole | Version portugaise