Menu
Coddy logo textTech

Patrón Adapter

Parte de la sección Programación Orientada a Objetos del Journey de Dart de Coddy. Lección 95 de 110.

El patrón Adapter permite que interfaces incompatibles funcionen juntas. Actúa como un puente entre dos clases que, de otro modo, no podrían colaborar, envolviendo una clase existente con una nueva interfaz que los clientes esperan. Esto resulta especialmente útil al integrar bibliotecas de terceros o código heredado en tu aplicación.

Imagina que tienes un sistema que trabaja con datos JSON, pero necesitas integrar un componente que solo genera XML. En lugar de modificar cualquiera de las dos clases, creas un adaptador que traduce entre ellas:

// Interfaz existente que tu sistema espera
abstract class JsonData {
  String getJson();
}

// Clase legacy con interfaz incompatible
class XmlService {
  String getXml() {
    return '<data><name>John</name></data>';
  }
}

// El adaptador hace que XmlService sea compatible con JsonData
class XmlToJsonAdapter implements JsonData {
  final XmlService _xmlService;

  XmlToJsonAdapter(this._xmlService);

  @override
  String getJson() {
    String xml = _xmlService.getXml();
    // Convierte XML a JSON (simplificado)
    return '{"name": "John"}';
  }
}

void main() {
  var xmlService = XmlService();
  var adapter = XmlToJsonAdapter(xmlService);

  print(adapter.getJson());  // {"name": "John"}
}

XmlToJsonAdapter envuelve XmlService e implementa la interfaz JsonData. El código cliente trabaja con la conocida interfaz JsonData sin saber que los datos procedían originalmente de una fuente XML. El adaptador gestiona toda la traducción internamente.

Usa el patrón Adapter cuando quieras utilizar una clase existente, pero su interfaz no coincida con lo que necesitas, o cuando necesites crear una clase reutilizable que coopere con clases cuyas interfaces sean incompatibles.

challenge icon

Desafío

Fácil

¡Construyamos un sistema de adaptadores para un reproductor multimedia! Imagina que tienes un sistema de audio moderno que espera que todas las fuentes multimedia proporcionen audio mediante una interfaz estándar, pero necesitas integrar un reproductor de discos de vinilo antiguo que tiene una forma completamente diferente de producir sonido.

Crearás dos archivos para organizar la implementación de tu patrón adaptador:

  • media_adapter.dart: Este archivo contiene tus clases de interfaz y adaptador. Define una clase abstracta AudioSource que tu sistema moderno espera; debe tener un método String playAudio() que devuelva la salida de audio como una cadena. Después, crea una clase VinylPlayer que represente el equipo antiguo; tiene un campo trackName y un método String spinRecord() que devuelve *crackle* Playing vinyl: [trackName] *crackle*. Por último, crea un VinylAdapter que implemente AudioSource y envuelva un VinylPlayer. El método playAudio() del adaptador debe llamar al método spinRecord() del reproductor de vinilo y devolver el resultado, conectando así las interfaces incompatibles.
  • main.dart: Importa tu archivo del adaptador multimedia y demuestra cómo el adaptador hace que el reproductor de vinilo antiguo funcione con código que espera la interfaz moderna AudioSource. Crea un VinylPlayer con el nombre de pista Bohemian Rhapsody. Después, crea un VinylAdapter que envuelva este reproductor de vinilo. Guarda el adaptador en una variable de tipo AudioSource para demostrar que cumple con la interfaz esperada. Llama a playAudio() en tu fuente de audio e imprime el resultado.

La belleza de este patrón es que tu código principal trabaja con la interfaz estándar AudioSource; ¡no necesita saber que, entre bastidores, un reproductor de vinilo antiguo está realizando el trabajo!

Salida esperada:

*crackle* Playing vinyl: Bohemian Rhapsody *crackle*

Pruébalo tú mismo

import 'media_adapter.dart';

void main() {
  // TODO: Crea un VinylPlayer con el nombre de la pista "Bohemian Rhapsody"
  
  // TODO: Crea un VinylAdapter que envuelva el vinyl player
  
  // TODO: Almacena el adaptador en una variable de tipo AudioSource
  
  // TODO: Llama a playAudio() en tu audio source e imprime el resultado
  
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de Dart online