Trabajar con el patrón de diseño del adaptador

Los patrones de diseño son soluciones a problemas recurrentes y complejidades en el diseño de software. Los patrones de diseño se clasifican como creacionales, estructurales o conductuales. Los patrones de creación se utilizan para crear y gestionar el mecanismo de creación de instancias de clases. Los patrones estructurales se utilizan para realizar las relaciones entre las entidades. Los patrones de diseño de comportamiento se ocupan de la colaboración de objetos y la delegación de responsabilidades.

El patrón de adaptador es un patrón de diseño estructural que actúa como un puente entre dos interfaces que son incompatibles. El término "Adaptador" se utiliza para representar un objeto que permite que dos interfaces mutuamente incompatibles se comuniquen y colaboren. En esencia, el patrón Adaptador permite que las clases (que tienen interfaces incompatibles) trabajen juntas y sus objetos se comuniquen si es necesario.

Hay ciertos tipos de adaptadores que implementan las interfaces de Target y Adaptee. Estos tipos de adaptadores se conocen como adaptadores bidireccionales. También tiene dos tipos distintos de adaptadores, a saber, adaptadores de clase y adaptadores de objeto. Mientras que el primero usa la herencia, el segundo usa la composición para solucionar problemas de incompatibilidad en sus diseños. Puede usar el patrón de diseño del adaptador cuando necesite usar una biblioteca de terceros que sea incompatible con los tipos que tiene en su aplicación.

La siguiente es la lista de los tipos que participan en una implementación típica del patrón Adaptador:

  • Objetivo
  • Adaptador
  • Adaptado
  • Cliente

Entendamos esto con un ejemplo. Suponga que dos personas que hablan y comprenden diferentes idiomas necesitan comunicarse: una puede ser francesa y la otra alemana. Por lo tanto, estas dos personas solo pueden hablar y comprender francés y alemán respectivamente, no ambos. Por lo general, necesitaría a alguien (un intérprete) que conozca ambos idiomas para facilitar la comunicación. Entonces, la persona que puede facilitar esta comunicación actúa como adaptador.

Este patrón se incluye en la categoría estructural, ya que usaría este patrón para estructurar los tipos en nuestra aplicación; por lo general, este patrón puede transformar una interfaz en otra. The Gang of Four define el patrón Adapter como "Convertir la interfaz de una clase en otra interfaz que los clientes esperan. El adaptador permite que las clases trabajen juntas que de otra manera no podrían debido a interfaces incompatibles".

Profundicemos en un código ahora. Considere las siguientes dos clases.

public class TargetA

            {

                public void DisplayA()

                {

                    Console.WriteLine("TargetA");

                }

            }

            public class TargetB

            {

                public void DisplayB()

                {

                    Console.WriteLine("TargetB");

                }

            }

Como puede ver, las dos clases son incompatibles, tampoco tienen una base común. La siguiente lista de códigos muestra cómo se ven las clases de adaptadores.

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;

                 }

            }

Tenga en cuenta que ambas clases de adaptadores tienen una interfaz común denominada ITargetAdapter que implementan estas clases. Cada una de las dos clases de adaptadores tiene un constructor de argumentos que acepta una referencia a un objeto de las respectivas clases de destino. La interfaz ITargetAdapter contiene la declaración del método Process (). Este método es implementado por las dos clases de adaptadores; estos métodos invocan Display () y los métodos de visualización respectivos de las clases de destino que implementamos anteriormente.

La siguiente lista de códigos ilustra cómo puede utilizar estas clases de adaptadores.

class Program

    {

        static void Main(string[] args)

        {

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

            adapter.Process();

            adapter = new AdapterB(new TargetB());

            adapter.Process();

            Console.Read();

        }

Como puede ver en el fragmento de código anterior, necesitamos pasar una instancia de la clase de destino respectiva al constructor de la clase del adaptador.

Presentaré discusiones sobre más patrones de diseño en mis próximas publicaciones aquí. El patrón de diseño del adaptador puede ser una buena elección cuando necesite invocar código heredado en sus aplicaciones. Puede obtener más información sobre el patrón de diseño del adaptador en este artículo.