Adaptateur (patron de conception)

Un article de Wikipédia, l'encyclopédie libre.

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

Sommaire

[modifier] 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.

[modifier] Autre nom

Wrapper

[modifier] Motivation / Exemple

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

[modifier] 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.

[modifier] Structure

Schéma UML du motif de conception Adaptateur
Schéma UML du motif de conception Adaptateur

[modifier] 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.

[modifier] Collaboration

[modifier] 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.

[modifier] Implémentation

[modifier] Exemple de code

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();
    }
};

[modifier] Utilisations connues

On peut également utiliser un adaptateur lorsque l'on ne veut pas implémenter toutes les méthodes d'une certaine interface. Par exemple, si l'on doit implémenter l'interface MouseListener en Java, mais que l'on ne souhaite pas implémenter de comportement pour toutes les méthodes, on peut dériver la classe MouseAdapter. Celle-ci fournit en effet un comportement par défaut (vide) pour toutes les méthodes de MouseListener.

Exemple avec le MouseAdapter :

public class MouseBeeper extends MouseAdapter
 {
   public void mouseClicked(MouseEvent e) {
     Toolkit.getDefaultToolkit().beep();
   }
 }

Exemple avec le MouseListener :

public class MouseBeeper implements MouseListener
 {
   public void mouseClicked(MouseEvent e) {
     Toolkit.getDefaultToolkit().beep();
   }
 
   public void mousePressed(MouseEvent e) {}
   public void mouseReleased(MouseEvent e) {}
   public void mouseEntered(MouseEvent e) {}
   public void mouseExited(MouseEvent e) {}
 }

[modifier] Voir aussi

[modifier] Articles connexes

[modifier] Liens et documents externes