Adapter

Catégorie

Patron structurel

Problème

Permettre à deux interfaces incompatibles de fonctionner ensemble. Lorsqu’une classe possède une interface que les clients n’attendent pas, ou lorsque vous devez réutiliser une classe existante dont l’interface ne correspond pas à vos besoins.

Solution

  • Créer une classe adapter qui implémente l’interface attendue
  • L’adapter enveloppe la classe existante et traduit les appels de son interface en appels sur la classe adaptée
  • Les clients interagissent avec l’adapter comme s’il s’agissait de l’interface attendue

Structure

  • Target : L’interface que les clients attendent
  • Adapter : Implémente Target et enveloppe Adaptee
  • Adaptee : L’interface existante qui doit être adaptée
  • Client : Code qui attend l’interface Target

Avantages clés

  • Réutilisabilité — Réutiliser des classes existantes qui ne correspondent pas à l’interface attendue
  • Découplage — Le client et l’Adaptee sont découplés via l’Adapter
  • Principe Ouvert/Fermé — De nouveaux adaptateurs peuvent être ajoutés sans modifier le code existant

Compromis

  • Ajoute une couche d’indirection supplémentaire qui peut obscurcir l’implémentation réelle
  • Peut nécessiter plusieurs adaptateurs pour différentes interfaces cibles

Quand l’utiliser

  • Vous souhaitez utiliser une classe existante, mais son interface n’est pas compatible avec vos besoins
  • Vous devez créer une classe réutilisable qui coopère avec des classes non liées ou imprévues
  • Plusieurs classes existantes ont des interfaces similaires mais diffèrent de manière subtile

Exemples