Patrones de diseño estructurales: Adapter

Intención del patrón
  • Convertir la interfaz de una clase en otra interfaz que el cliente espera. Adapter permite trabajar a clases de manera conjunta que de otra manera sería imposible por incompatibilidad de interfaces.
  • Envolver una clase existente con una nueva interfaz.
  • Necesidad de coincidir con la interfaz de un viejo componente con un nuevo sistema.

Ejemplo de problema
Un viejo componente una convincente funcionalidad que invita a reutilizarlo, pero su "visión del mundo" no es compatible con la filosofía y arquitectura del sistema actualmente en desarrollo.

Discusión
Reutilizar siempre ha sido doloroso y evasivo. Una razón ha sido la tribulación de diseñar algo nuevo mientras se reutiliza algo viejo. Siempre hay algo que no está bien entre lo nuevo y lo viejo. Puede ser por dimensiones físicas o desalineación. Puede ser de temporización o sincronización. Puede ser por hipótesis equivocadas o simplemente, las normas de la competencia.
Es similar al problema de insertar un enchufe nuevo de tres conectores eléctricos en una terminal para dos conectores. Algún tipo de adaptador o intermediario es necesario.
Adapter trata acerca de la creación de una abstracción intermediaria que convierta, o mapee, el viejo componente al nuevo sistema. Los Clientes invocan métodos del objeto Adapter, el cual a su vez, redirige dicha llamada al componente mencionado. Esta estrategia puede ser implementada tanto con herencia como con composición.
Adapter funciona como una envoltura o modificador de una clase existente. Proporciona una diferente o traducida vista de dicha clase.

Estructura
Debajo, el método Display() de un componente Rectangle espera recibir los argumentos "x, y, w, h". Pero el cliente desea pasar la posición (x, y) superior izquierda y la posición (x, y) inferior derecha. Esta incongruencia se puede conciliar mediante un nivel adicional de indirección. Por ej.: un objeto Adapter.


El Adapter también podría ser considerado como un Wrapper.


Ejemplo
El patrón Adapter permite a clases incompatibles trabajar de manera conjunta mediante la conversión de la interfaz de una de las clases a la interfaz esperada por el cliente. Las llaves de tubo son un ejemplo claro de Adapter. Un zócalo se adhiere a un trinquete siempre que el amaño de la unidad sea la misma. Los tamaños típicos en Estados Unidos son 1/2" y 1/4". Obviamente, un trinquete de 1/2" no se adhiere a una unidad de 1/4" a menos que un adaptador sea usado. Un adaptador de 1/2" a 1/4" posee una conexión hembra de 1/2" para que quepa en el trinquete de 1/2" y una conexión macho de 1/4" para que quepa en la unidad.


Check list
Identificar a los involucrados: el/los compontente/s que se quiere acomodar (Ejemplo: el cliente) y el componente que necesita ser adaptado (Ejemplo: el adaptado).
Identificar la interfaz que el cliente requiere.
Diseñar una clase Wrapper que pueda hacer coincidir el adaptado con el cliente.
La clase Adapter/Wrapper posee una instancia de la clase a adaptar.
La clase Adapter/Wrapper "mapea" la interfaz del cliente a la interfaz del adaptado.
El cliente usa (Se acopla a) la nueva interfaz.

Reglas de oro

  • El patrón Adapter hace que las cosas funcionen luego de haber sido diseñadas. por otro lado el patrón Bridge hace que funcionen antes del diseño.
  • El patrón Bridge está diseñado por adelantado para que la abstracción y la implementación varíen independientemente mientras que Adapter es retroadaptado para que las clases puedan trabajar en forma conjunta.
  • El patrón Adapter proporciona una interfaz diferente a su objeto, el patrón Proxy proporciona la misma interfaz y el patró Decorator proporciona una interfaz mejorada.
  • El patrón Adapter tiene por finalidad cambiar la interfaz de un objeto existente mientras que el patrón Decorator mejora otro objeto sin cambiar su interfaz. Decorator, es por esto, más transparente para la aplicación de lo que Adapter es. Como consecuencia, Decorator soporta una composición recursiva la cual no sería posible con Adapters puros.
  • El patrón Facade define una nueva interfaz, mientras que Adapter reutiliza una vieja interfaz. Hay que recordar que Adapter hace que dos interfaces existentes funcionen de manera conjunta en oposición a la creación de una completamente nueva.


Ejemplo de código en C#
using System;

class MainApp
{
  static void Main()
  {
    // Create adapter and place a request 
    Target target = new Adapter();
    target.Request();

    // Wait for user 
    Console.Read();
  }
}

// "Target" 
class Target
{
  public virtual void Request()
  {
    Console.WriteLine("Called Target Request()");
  }
}

// "Adapter" 
class Adapter : Target
{
  private Adaptee adaptee = new Adaptee();

  public override void Request()
  {
    // Possibly do some other work 
    // and then call SpecificRequest 
    adaptee.SpecificRequest();
  }
}

// "Adaptee" 
class Adaptee
{
  public void SpecificRequest()
  {
    Console.WriteLine("Called SpecificRequest()");
  }
}

0 comentarios:

Publicar un comentario

Muchas gracias por leer el post y comentarlo.

 
Copyright 2009 Programación SOLIDa
BloggerTheme by BloggerThemes | Design by 9thsphere