Aller au contenu principal

Adaptateur

Les design patterns25 min

Conserver un bon comportement derrière l'interface attendue.

Dans cette leçon

Le bon service, la mauvaise forme

Le comportement existe déjà. Seule sa forme ne correspond pas au contrat attendu par le client.

LegacyPrinter sait imprimer, mais expose printText. Le reste de l'application attend Printer#print. Modifier tous les clients ou casser la classe existante créerait une migration risquée.

Printing.java

Le signal à reconnaître

« J'ai le bon comportement, pas la bonne interface. » L'adaptateur traduit la forme. Il n'invente pas le comportement manquant.

Le traducteur au milieu

  1. Le client parle à Target

    ReceiptService dépend de l'interface attendue Printer.
  2. Adaptateur traduit

    PrinterAdapter implémente Printer et transforme l'appel print en printText.
  3. Adaptee fait le vrai travail

    L'objet LegacyPrinter reste inchangé et imprime réellement le texte.
Main.java
RôleExempleCe qu'il connaît
TargetPrinterLe contrat voulu par l'application.
AdaptateurPrinterAdapterTarget et l'objet existant.
AdapteeLegacyPrinterSon ancienne API seulement.
ClientReceiptServiceTarget seulement.

Renommer, transformer, restructurer

Traduire ne signifie pas seulement renommer une méthode. La forme des données ou d'une structure peut aussi changer.

VarianteDécalageAction de l'adaptateur
Renommerprint contre printTextDéléguer sous le nom attendu.
TransformerDeux champs contre un nom completConstruire le modèle attendu.
RestructurerNœuds internes contre nœuds affichablesConvertir récursivement la forme.

Transformer un modèle

UserAdapter.java

Restructurer un arbre

BinarySearchTreeAdapter.java

Le cas de base null est traité avant de construire le nœud cible. Les deux positions gauche et droite restent distinctes, même lorsqu'un enfant manque.

Garder l'adaptateur mince

Bon cas

  • • Renommer une opération.
  • • Réordonner ou convertir quelques paramètres.
  • • Faire entrer un modèle externe dans le contrat interne.

Mauvais cas

  • • Calculer une règle de facturation.
  • • Décider le workflow métier.
  • • Accumuler des conversions sans nettoyer l'architecture.

Quand ne pas l'utiliser

Si vous contrôlez les deux interfaces et pouvez les aligner directement sans migration risquée, l'adaptateur ajoute une couche inutile. S'il grossit jusqu'à devenir un service métier, sa frontière est déjà dépassée.

Le bénéfice est la réutilisation de l'existant. Le coût est un mapping supplémentaire, parfois avec une perte d'information qu'il faut rendre explicite.

Vérifiez vos réflexes

Vérifiez vos réflexes

Une réponse par question. La correction apparaît tout de suite.

1. Quel rôle désigne le contrat attendu par le client ?
2. Que doit faire PrinterAdapter#print() ?
3. Quel signal correspond à Adaptateur ?
4. Quel contenu rendrait un adaptateur suspect ?
5. Quel couple bénéfice/coût est correct ?

Branchez une ancienne API

Traduisez une interface

Écrivez d'abord. Une IA externe pourra ensuite relire votre travail. Son retour peut être faux. Vérifiez-le avec la leçon.

Le client dépend de : interface Archive { void store(String name, byte[] content); } La classe existante ne doit pas être modifiée : class OldVault { void putFile(byte[] data, String fileName) { ... } } 1. Écrivez VaultAdapter. 2. Il implémente Archive et reçoit OldVault au constructeur. 3. Il renomme l'appel et remet les paramètres dans le bon ordre. 4. Montrez un usage via une variable de type Archive. 5. Identifiez Target, Adaptateur, Adaptee et client. 6. Expliquez pourquoi une règle de rétention de 30 jours ne devrait pas vivre dans cet adaptateur.

Brouillon enregistré sur cet appareil.

À coller dans l'IA de votre choix.
Voir le prompt qui sera copié
Vous corrigez le travail d'un étudiant qui prépare une remédiation Java 17. Évaluez d'abord son raisonnement, ses invariants et la cohérence de son brouillon. Un code incomplet mais bien expliqué mérite un retour utile. Signalez précisément les erreurs sans inventer d'exigences hors sujet.

Cette leçon porte sur Adapter en Java. Vérifiez que VaultAdapter implémente Archive, possède l'objet OldVault et lui délègue sans réimplémenter le stockage. Les deux paramètres doivent être transmis dans l'ordre attendu par putFile. Le client doit rester typé avec Archive. Vérifiez les quatre rôles et refusez toute logique métier de rétention dans l'adaptateur. Le brouillon peut être incomplet, mais le sens de la traduction doit être exact.

Travail demandé:
Le client dépend de :

interface Archive {
  void store(String name, byte[] content);
}

La classe existante ne doit pas être modifiée :

class OldVault {
  void putFile(byte[] data, String fileName) { ... }
}

1. Écrivez VaultAdapter.
2. Il implémente Archive et reçoit OldVault au constructeur.
3. Il renomme l'appel et remet les paramètres dans le bon ordre.
4. Montrez un usage via une variable de type Archive.
5. Identifiez Target, Adapter, Adaptee et client.
6. Expliquez pourquoi une règle de rétention de 30 jours ne devrait pas vivre dans cet adaptateur.

Commencez par poser au plus deux questions si une intention reste ambiguë. Donnez ensuite les points corrects, les problèmes précis et la plus petite prochaine étape. Ne fournissez une solution complète que si l'étudiant la demande explicitement.

Réponse de l'étudiant:
[aucune réponse collée]

Continuez le parcours

Centre de commandes

Rechercher une page et s'y rendre