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 : HelloLe 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.
Défi
FacileConstruisons 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 classeLegacyAudioPlayerdans l’espace de nomsMediaSystem, avec une méthodePlayMp3(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 interfaceIMediaPlayeravec une méthodePlay(string filename)qui renvoie une chaîne. Créez ensuite une classeMediaPlayerAdapterqui implémenteIMediaPlayer. Votre adaptateur doit encapsuler une instance deLegacyAudioPlayer(transmise par le constructeur) et traduire l’appel àPlayen un appel à la méthodePlayMp3du 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’interfaceIMediaPlayer. 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.mp3Tout 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
}
}
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
1Fondamentaux de la POO
Fichiers externesEspaces de noms et directivesIntro aux classes et objetsLe mot-clé 'this'Méthodes et paramètresChamps vs PropriétésConstructeursInitialiseurs d'objetsRécapitulatif - Calculatrice simple4Héritage
Syntaxe de base de l'héritage (:)Le mot-clé 'base'Mots-clés Virtual & OverrideClasses scelléesLa classe de base 'object'Récapitulatif - Hiérarchie des employés7Fonctionnalités avancées
Surcharge d'opérateursIndexeurs (this[])Redéfinition de ToString()Méthodes d'extensionRécapitulatif - Liste personnalisée10Patrons de conception - Partie 1
Introduction aux patrons de conceptionSingleton Thread-SafePatron FabriquePatron Observateur (Événements)Patron Stratégie2Propriétés et membres statiques
Propriétés auto-implémentéesPropriétés en lecture/écriture seuleChamps et méthodes statiquesClasses statiquesMembres à corps d'expression5Polymorphisme & Interfaces
Polymorphisme : Compilation vs ExécutionInterface vs Classe AbstraiteInterfaces MultiplesInterfaces ExplicitesUpcasting & DowncastingRécapitulatif - Calculateur de Formes8Concepts avancés de la POO
Composition plutôt qu'héritageGénériques (Classes et Méthodes)Délégués et ÉvénementsAttributs et RéflexionIDisposable et l'instruction usingBases de l'Injection de Dépendances11Patrons de conception, Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode TemplatePatron ÉtatPatron Composite3Architecture des classes
Données d'instance vs statiquesMots-clés 'readonly' & 'const'Champs de supportRécapitulatif - Gestionnaire de compte bancaire6Encapsulation
Modificateurs d'accèsPropriétés pour l'encapsulationImplémentation du masquage de donnéesPatterns d'immuabilitéRécapitulatif - Dossiers d'étudiants12Projet : Système de gestion de bibliothèque
Structure du projetModèles Livre et UtilisateurLogique du système d'empruntLINQ pour la rechercheInterface Console / Interface d'administrationTests unitaires (NUnit/xUnit)Entraînez-vous par vous-même : Compilateur C# en ligne