¡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. Design Patterns en PHP
  3. El patrón de diseño Adapter
Extrait - Design Patterns en PHP Los 23 patrones de diseño: descripciones y soluciones ilustradas en UML2 y PHP (2ª edición)
Extractos del libro
Design Patterns en PHP Los 23 patrones de diseño: descripciones y soluciones ilustradas en UML2 y PHP (2ª edición) Volver a la página de compra del libro

El patrón de diseño Adapter

Descripción

El objetivo del patrón de diseño Adapter es convertir la interfaz de una clase existente en la interfaz esperada por los clientes para que puedan colaborar.

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 10.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 concretiza estos tres métodos.

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 otro componente de terceros, aunque su interfaz no se corresponde con la interfaz Documento. Por lo tanto, va a haber que adaptar la una a la otra. La figura 10.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 de diseño Adapter proporciona una solución que consiste en crear la clase DocumentoPdf que implemente la interfaz Documento y posea una asociación de tipo composición con una instancia de la clase ComponentePdf. La implementación de los tres métodos de la interfaz Documento consiste en delegar correctamente las llamadas a ComponentePdf. Esta solución se muestra en la figura 10.1, el código de los métodos se detalla con ayuda de notas.

images/p95.png

Figura 10.1...

Estructura

1. Diagrama de clases

La figura 10.2 detalla la estructura genérica del patrón de diseño Adapter.

images/figure10-2.png

Figura 10.2 - Estructura del patrón de diseño Adapter

2. Participantes

Los participantes del patrón de diseño Adapter son los siguientes:

  • Interfaz (DocumentoInterfaz) expone la firma de los métodos indispensables en todo documento.

  • Cliente interactúa con los objetos que se adaptan a Interfaz.

  • Adaptador (DocumentoPdf) implementa los métodos de Interfaz invocando por delegación los métodos del objeto adaptado.

  • Adaptado (ComponentePdf) es la clase cuya interfaz ha sido adaptada para corresponder a lo que exige Interfaz.

3. Colaboraciones

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

images/rfigure103.PNG

Figura 10.3 - Diagrama de secuencia del patrón de diseño Adapter

Dominios de aplicación

El patrón de diseño Adapter 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 PHP

A continuación presentamos el código del ejemplo escrito en PHP. Empezamos por la interfaz DocumentoInterfaz:

<?php 
 
declare(strict_types=1); 
 
namespace ENI\DesignPatterns\Adapter; 
 
interface DocumentoInterfaz 
{ 
   public function setContenido(string $contenido): void; 
 
   public function dibuja(): void; 
 
   public function imprime(): void; 
} 

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

<?php 
 
declare(strict_types=1); 
 
namespace ENI\DesignPatterns\Adapter; 
 
class DocumentoHtml implements DocumentoInterfaz 
{ 
   protected string $contenido; 
 
   public function setContenido(string $contenido): void 
   { 
       $this->contenido = $contenido;  
   } 
 
   public function dibuja(): void  
   { 
       echo "Dibuja documento HTML: $this->contenido" . PHP_EOL; 
   } 
 
   public function imprime(): void 
   { 
       echo "Imprime documento HTML : $this->contenido"...