Menu
Coddy logo textTech

Patron Adaptateur

Fait partie de la section Programmation Orientée Objet du Journey C# de Coddy. Leçon 57 sur 70.

Le pattern Adapter est un pattern structurel qui permet à des interfaces incompatibles de fonctionner ensemble. Il agit comme un pont entre deux classes, en convertissant l’interface d’une classe en une interface attendue par les clients. Imaginez-le comme un adaptateur électrique qui vous permet de brancher un appareil européen sur une prise américaine.

Ce modèle est particulièrement utile lorsque vous souhaitez utiliser une classe existante, mais que son interface ne correspond pas à ce dont votre code a besoin. Au lieu de modifier la classe d’origine (que vous ne contrôlez peut-être pas), vous créez un adaptateur qui l’enveloppe :

// Classe existante avec une interface incompatible
public class OldPrinter
{
    public void PrintMessage(string msg) => Console.WriteLine($"Old: {msg}");
}

// Interface attendue par votre code
public interface IPrinter
{
    void Print(string text);
}

// L'adaptateur comble l'écart
public class PrinterAdapter : IPrinter
{
    private OldPrinter _oldPrinter;
    
    public PrinterAdapter(OldPrinter oldPrinter)
    {
        _oldPrinter = oldPrinter;
    }
    
    public void Print(string text)
    {
        _oldPrinter.PrintMessage(text);  // Délègue à l'ancienne interface
    }
}

Votre code peut maintenant fonctionner avec l’ancienne imprimante via l’interface attendue :

OldPrinter legacy = new OldPrinter();
IPrinter printer = new PrinterAdapter(legacy);

printer.Print("Hello");  // Ancien : Hello

Le modèle Adaptateur est précieux lors de l’intégration de bibliothèques tierces ou de code hérité dans votre application. Le code client fonctionne avec l’interface IPrinter, sans savoir qu’une ancienne classe incompatible effectue réellement le travail en coulisses.

challenge icon

Défi

Facile

Construisons un système de lecteur multimédia en utilisant le modèle Adaptateur. Vous disposez d’une bibliothèque audio existante qui lit les fichiers MP3, mais votre application a besoin d’une interface unifiée capable de gérer différents types de médias. Vous allez créer un adaptateur pour combler cet écart, permettant à votre lecteur multimédia moderne de fonctionner de manière transparente avec la bibliothèque audio héritée.

Vous organiserez votre code dans trois fichiers :

  • LegacyAudio.cs : Cela représente une bibliothèque existante que vous ne pouvez pas modifier. Créez une classe LegacyAudioPlayer dans l’espace de noms MediaSystem, avec une méthode PlayMp3(string filename) qui renvoie la chaîne "Playing MP3: {filename}". Il s’agit de votre « adaptee » : la classe dont l’interface est incompatible.
  • MediaAdapter.cs : Créez l’interface et l’adaptateur dans le même espace de noms. Définissez une interface IMediaPlayer avec une méthode Play(string filename) qui renvoie une chaîne. Créez ensuite une classe MediaPlayerAdapter qui implémente IMediaPlayer. Votre adaptateur doit encapsuler une instance de LegacyAudioPlayer (transmise par le constructeur) et traduire l’appel à Play en un appel à la méthode PlayMp3 du lecteur hérité.
  • Program.cs : Assemblez tous les éléments en créant le lecteur hérité, en l’encapsulant dans votre adaptateur, puis en utilisant l’adaptateur via l’interface IMediaPlayer. Cela montre comment le code client peut fonctionner avec l’interface moderne tandis que l’adaptateur gère la communication avec le système hérité en arrière-plan.

Vous recevrez une entrée :

  • Le nom du fichier à lire (par exemple, song.mp3)

Créez un LegacyAudioPlayer, encapsulez-le dans un MediaPlayerAdapter, puis appelez Play sur l’adaptateur en utilisant l’interface IMediaPlayer et affichez le résultat.

Par exemple, si l’entrée est favorite_track.mp3, la sortie doit être :

Playing MP3: favorite_track.mp3

Tout l’intérêt de ce modèle est que votre code principal interagit uniquement avec IMediaPlayer : il ne sait pas qu’une bibliothèque audio héritée effectue réellement le travail. Si vous devez plus tard prendre en charge une autre bibliothèque héritée, il vous suffira de créer un nouvel adaptateur sans modifier le moindre code client !

Essayez vous-même

using System;
using MediaSystem;

class Program
{
    public static void Main(string[] args)
    {
        // Lire l'entrée du nom de fichier
        string filename = Console.ReadLine();
        
        // TODO: Créer une instance de LegacyAudioPlayer
        
        // TODO: L'envelopper dans un MediaPlayerAdapter
        
        // TODO: Utiliser l'adaptateur via l'interface IMediaPlayer
        // et afficher le résultat de l'appel à Play avec le nom de fichier
    }
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Programmation Orientée Objet

Entraînez-vous par vous-même : Compilateur C# en ligne