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