¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. Patrones de diseño en C#
  3. El patrón Adapter
Extrait - Patrones de diseño en C# Los 23 modelos de diseño: descripción y soluciones ilustradas en UML 2 y C# [2ªedición]
Extractos del libro
Patrones de diseño en C# Los 23 modelos de diseño: descripción y soluciones ilustradas en UML 2 y C# [2ªedición] Volver a la página de compra del libro

El patrón Adapter

Descripción

El objetivo del patrón Adapter es convertir la interfaz de una clase existente en la interfaz esperada por los clientes también existentes de modo que puedan trabajar de manera conjunta. Se trata de conferir a una clase existente una nueva interfaz para responder a las necesidades de los clientes.

Ejemplo

El servidor Web del sistema de venta de vehículos crea y administra los documentos destinados a los clientes. La interfaz Documento se ha definido para realizar esta gestión. La figura 3-2.1 muestra su representación UML así como los tres métodos setContenido, dibuja e imprime. Se ha realizado una primera clase de implementación de esta interfaz: la clase DocumentoHtml que implementa estos tres métodos. Los objetos clientes de esta interfaz y esta clase cliente ya se han diseñado.

Por otro lado, la agregación de documentos PDF supone un problema pues se trata de documentos más complejos de construir y de administrar que los documentos HTML. Para ello se ha escogido un producto del mercado, aunque su interfaz no se corresponde con la interfaz Documento. La figura 3-2.1 muestra el componente ComponentePdf cuya interfaz incluye más métodos y la nomenclatura es bien diferente (con el prefijo pdf).

El patrón Adapter proporciona una solución que consiste en crear la clase DocumentoPdf que implemente la interfaz Documento y posea una asociación con ComponentePdf. La implementación de los tres métodos de la interfaz Documento consiste en delegar correctamente las llamadas al componente PDF. Esta solución se muestra en la figura 3-2.1, el código de los métodos se detalla con ayuda de notas.

images/2figure10-1c.png

Figura 3-2.1 - El patrón Adapter aplicado...

Estructura

1. Diagrama de clases

La figura 3-2.2 detalla la estructura genérica del patrón.

images/figure10-2.png

Figura 3-2.2 - Estructura del patrón Adapter

2. Participantes

Los participantes del patrón son los siguientes:

  • Interfaz (Documento) incluye la firma de los métodos del objeto.

  • Cliente (ServidorWeb) interactúa con los objetos respondiendo a la interfaz Interfaz.

  • Adaptador (DocumentoPdf) implementa los métodos de la interfaz Interfaz invocando a los métodos del objeto adaptado.

  • Adaptado (ComponentePdf) incluye el objeto cuya interfaz ha sido adaptada para corresponder a la interfaz Interfaz.

3. Colaboraciones

El cliente invoca el método solicitud del adaptador que, en consecuencia, interactúa con el objeto adaptado invocando el método realiza. La figura 3-2.3 ilustra estas colaboraciones.

images/rfigure103.PNG

Figura 3-2.3 - Diagrama de secuencia del patrón Adapter

Dominios de aplicación

El patrón se utiliza en los siguientes casos:

  • Para integrar en el sistema un objeto cuya interfaz no se corresponde con la interfaz requerida en el interior de este sistema.

  • Para proveer interfaces múltiples a un objeto en su etapa de diseño.

Ejemplo en C#

A continuación presentamos el código del ejemplo escrito en C#.

Comenzamos por la interfaz Documento:

using System; 
 
public interface Documento 
{ 
  string contenido { set; } 
  void dibuja(); 
  void imprime(); 
} 

La clase DocumentoHtml es el ejemplo de clase que implementa la interfaz Documento.

using System; 
 
public class DocumentoHtml : Documento 
{ 
  protected string _contenido; 
 
  public string contenido 
  { 
     protected get 
     { 
        return _contenido; 
     } 
     set 
     { 
        _contenido = value; 
     } 
  } 
 
  public void dibuja() 
  { 
    Console.WriteLine("Dibuja el documento HTML: " + 
         contenido); 
  } 
 
  public void imprime() 
  { 
    Console.WriteLine("Imprime el documento HTML: " + 
      contenido); ...