Utilisation du modèle de conception de l'adaptateur

Les modèles de conception sont des solutions aux problèmes récurrents et aux complexités de la conception de logiciels. Les modèles de conception sont classés comme étant créatifs, structurels ou comportementaux. Les modèles de création sont utilisés pour créer et gérer le mécanisme de création d'instances de classes. Les modèles structurels sont utilisés pour réaliser les relations entre les entités. Les modèles de conception comportementale traitent de la collaboration d'objets et de la délégation des responsabilités.

Le modèle d'adaptateur est un modèle de conception structurelle qui agit comme un pont entre deux interfaces incompatibles. Le terme «adaptateur» est utilisé pour représenter un objet qui permet à deux interfaces incompatibles entre elles de communiquer et de collaborer. En substance, le modèle d'adaptateur permet aux classes (qui ont des interfaces incompatibles) de travailler ensemble et leurs objets communiquent si nécessaire.

Il existe certains types d'adaptateurs qui implémentent les interfaces de la cible et de l'adapté. Ces types d'adaptateurs sont appelés adaptateurs bidirectionnels. Vous disposez également de deux types distincts d'adaptateurs, à savoir les adaptateurs de classe et les adaptateurs d'objet. Alors que le premier utilise l'héritage, le second utilise la composition pour résoudre les problèmes d'incompatibilité dans vos conceptions. Vous pouvez utiliser le modèle de conception d'adaptateur lorsque vous devez utiliser une bibliothèque tierce incompatible avec les types que vous avez dans votre application.

Voici la liste des types qui participent à une implémentation typique du modèle d'adaptateur:

  • Cible
  • Adaptateur
  • Adaptee
  • Client

Comprenons cela avec un exemple. Supposons que deux personnes qui parlent et comprennent des langues différentes doivent communiquer - l'une peut être le français et l'autre l'allemand. Ainsi, ces deux personnes ne peuvent parler et comprendre respectivement que le français et l'allemand - pas les deux. Vous auriez généralement besoin de quelqu'un (un interprète) qui connaît ces deux langues pour faciliter la communication. Ainsi, la personne qui peut faciliter cette communication fait office d'adaptateur.

Ce modèle appartient à la catégorie structurelle puisque vous utiliseriez ce modèle pour structurer les types dans notre application - généralement ce modèle peut transformer une interface en une autre. Le groupe de quatre définit le modèle d'adaptateur comme «Convertissez l'interface d'une classe en une autre interface attendue par les clients. L'adaptateur permet aux classes de travailler ensemble, ce qui ne pourrait pas autrement en raison d'interfaces incompatibles.

Passons maintenant au code. Considérez les deux classes suivantes.

public class TargetA

            {

                public void DisplayA()

                {

                    Console.WriteLine("TargetA");

                }

            }

            public class TargetB

            {

                public void DisplayB()

                {

                    Console.WriteLine("TargetB");

                }

            }

Comme vous pouvez le voir, les deux classes sont incompatibles - elles n'ont pas non plus de base commune. La liste de code suivante montre à quoi ressemblent les classes d'adaptateur.

public interface ITargetAdapter

            {

                void ProcessData();

            }

public class AdapterA : ITargetAdapter

            {

                 public TargetA targetA { get; set; }

                 public void Process()

                 {

                     targetA.DisplayA();

                 }

                 public AdapterA(TargetA obj)

                 {

                     targetA = obj;

                 }

            }

            public class AdapterB : ITargetAdapter

            {

                 public TargetB targetB { get; set; }

                 public void Process() { targetB.DisplayB(); }

                 public AdapterB(TargetB obj)

                 {

                     targetB = obj;

                 }

            }

Notez que les deux classes d'adaptateur ont une interface commune nommée ITargetAdapter que ces classes implémentent. Chacune des deux classes d'adaptateur a un constructeur d'argument qui accepte une référence à un objet des classes cibles respectives. L'interface ITargetAdapter contient la déclaration de la méthode Process (). Cette méthode est implémentée par les deux classes d'adaptateur - ces méthodes invoquent Display () et les méthodes d'affichage respectives des classes cibles que nous avons implémentées précédemment.

La liste de codes suivante illustre comment vous pouvez utiliser ces classes d'adaptateur.

class Program

    {

        static void Main(string[] args)

        {

            ITargetAdapter adapter = new AdapterA(new TargetA());

            adapter.Process();

            adapter = new AdapterB(new TargetB());

            adapter.Process();

            Console.Read();

        }

Comme vous pouvez le voir dans l'extrait de code ci-dessus, nous devons transmettre une instance de la classe cible respective au constructeur de la classe adaptateur.

Je présenterai des discussions sur plus de modèles de conception dans mes prochains articles ici. Le modèle de conception d'adaptateur peut être un bon choix lorsque vous devez appeler du code hérité dans vos applications. Vous pouvez en savoir plus sur le modèle de conception de l'adaptateur dans cet article.