Command Palette

Search for a command to run...

Adapter Pattern: Conectando Interfaces Incompatibles

Aprende a hacer que interfaces incompatibles trabajen juntas usando el patrón Adapter, permitiendo integrar sistemas sin modificar su código existente.

Lectura: 11 min
Nivel: Intermedio

TL;DR - Resumen rápido

  • El Adapter Pattern permite que interfaces incompatibles trabajen juntas
  • El adapter actúa como un puente entre dos interfaces diferentes
  • No necesitas modificar el código existente para usarlo
  • Permite integrar bibliotecas de terceros sin cambios
  • Convierte la interfaz de una clase en otra que el cliente espera

Introducción al Adapter Pattern

El Adapter Pattern es un patrón de diseño estructural que permite que interfaces incompatibles trabajen juntas. El adapter actúa como un traductor entre dos interfaces, convirtiendo la interfaz de una clase en otra que el cliente espera.

En JavaScript, el patrón Adapter es especialmente útil cuando integras bibliotecas de terceros, APIs legadas o sistemas que no fueron diseñados para trabajar juntos. En lugar de modificar el código existente, creas un adapter que traduce entre las interfaces incompatibles.

Adapter vs Facade Pattern

El Adapter Pattern convierte una interfaz en otra, mientras que el Facade Pattern simplifica una interfaz existente. El Adapter hace que interfaces incompatibles sean compatibles, mientras que el Facade hace que una interfaz compleja sea más fácil de usar.

Concepto del Adapter Pattern

El patrón Adapter consta de tres componentes principales: el Target (la interfaz que el cliente espera), el Adaptee (la interfaz existente que necesita adaptarse), y el Adapter (que implementa la interfaz Target y traduce las llamadas al Adaptee).

Implementación Básica

Una implementación básica del Adapter Pattern requiere crear una clase que implementa la interfaz esperada por el cliente y mantiene una referencia al objeto existente que necesita adaptarse. El adapter traduce las llamadas del cliente a la interfaz del objeto existente.

adapter-basico.js
Loading code...

Este ejemplo muestra cómo implementar el patrón Adapter para hacer que un sistema de pagos antiguo funcione con una nueva interfaz. El adapter traduce entre la interfaz moderna que el cliente espera y la interfaz antigua del sistema existente.

Traducción de Interfaces

El principal beneficio del Adapter Pattern es que permite integrar código existente sin modificarlo. El adapter actúa como un traductor, convirtiendo las llamadas de la nueva interfaz a la interfaz antigua que el sistema existente entiende.

Adapter de Objetos

En JavaScript, puedes implementar el patrón Adapter usando objetos o clases. El adapter de objetos usa composición para envolver el objeto existente y proporcionar la nueva interfaz, mientras que el adapter de clases usa herencia.

adapter-objetos.js
Loading code...

Este ejemplo demuestra cómo usar el patrón Adapter para integrar diferentes APIs de mapas. El adapter permite que el código del cliente use una interfaz unificada, independientemente de si el proveedor es Google Maps o Mapbox.

  • El Target es la interfaz que el cliente espera usar
  • El Adaptee es la interfaz existente que necesita adaptarse
  • El Adapter implementa el Target y traduce las llamadas al Adaptee
  • Los adapters pueden usar composición o herencia
  • Permite integrar sistemas sin modificar el código existente

Casos de Uso Reales

El Adapter Pattern tiene numerosas aplicaciones en desarrollo web moderno. Desde integrar APIs de terceros hasta normalizar formatos de datos y conectar sistemas legados, este patrón es ideal para cualquier escenario donde necesites hacer que interfaces incompatibles trabajen juntas.

casos-uso-adapter.js
Loading code...

Este ejemplo muestra cómo usar el patrón Adapter para normalizar diferentes formatos de datos. El adapter permite que el código del cliente trabaje con datos en formato JSON, incluso cuando la fuente original es XML, sin necesidad de conocer los detalles de cada formato.

  • <strong>Integrar APIs de terceros:</strong> Adaptar bibliotecas externas a tu interfaz interna
  • <strong>Conectar sistemas legados:</strong> Hacer que código antiguo funcione con interfaces modernas
  • <strong>Normalizar formatos de datos:</strong> Convertir entre JSON, XML, CSV u otros formatos
  • <strong>Cambiar proveedores:</strong> Intercambiar servicios sin modificar el código cliente
  • <strong>Versiones de API:</strong> Adaptar diferentes versiones de una API a una interfaz común

Aplicaciones del Adapter Pattern

El Adapter Pattern es ideal para integrar APIs de terceros, conectar sistemas legados, normalizar formatos de datos, hacer que bibliotecas incompatibles trabajen juntas, y cualquier escenario donde necesites traducir entre interfaces diferentes.

Errores Comunes

Al implementar el patrón Adapter, existen varios errores comunes que pueden causar comportamientos inesperados, pérdida de funcionalidad, o código difícil de mantener. Es importante conocer estos patrones de error para evitarlos.

errores-adapter.js
Loading code...

El primer error muestra lo que sucede cuando el adapter no implementa completamente la interfaz Target: el cliente no puede usar todas las funcionalidades esperadas. El segundo error demuestra cómo los adapters que ocultan demasiada funcionalidad pueden perder capacidades importantes del adaptee.

Advertencia: Implementación Completa

Siempre asegúrate de que el adapter implemente completamente la interfaz Target. Si el adapter no implementa todos los métodos necesarios, el cliente no podrá usar toda la funcionalidad esperada. Considera usar TypeScript o documentación para asegurar la implementación completa.

Resumen: Adapter Pattern

Conceptos principales:

  • El Adapter Pattern permite que interfaces incompatibles trabajen juntas
  • El adapter actúa como un puente entre dos interfaces diferentes
  • El Target es la interfaz que el cliente espera
  • El Adaptee es la interfaz existente que necesita adaptarse
  • El Adapter implementa el Target y traduce las llamadas al Adaptee

Mejores prácticas:

  • Usa adapters para integrar sistemas sin modificar código existente
  • Implementa completamente la interfaz Target en el adapter
  • Documenta claramente qué hace cada método del adapter
  • Considera usar composición en lugar de herencia cuando sea posible
  • Evita crear adapters genéricos que no añaden valor real