Menu
Coddy logo textTech

Pattern Adapter

Fa parte della sezione Programmazione orientata agli oggetti del percorso Dart di Coddy. Lezione 95 di 110.

Il pattern Adapter consente a interfacce incompatibili di lavorare insieme. Agisce da ponte tra due classi che altrimenti non potrebbero collaborare, avvolgendo una classe esistente con una nuova interfaccia che i client si aspettano. È particolarmente utile quando si integrano librerie di terze parti o codice legacy nella propria applicazione.

Immagina di avere un sistema che lavora con dati JSON, ma devi integrare un componente che produce solo XML. Invece di modificare una delle due classi, crei un adattatore che traduce tra loro:

// Interfaccia esistente prevista dal sistema
abstract class JsonData {
  String getJson();
}

// Classe legacy con un'interfaccia incompatibile
class XmlService {
  String getXml() {
    return '<data><name>John</name></data>';
  }
}

// L'adattatore rende XmlService compatibile con JsonData
class XmlToJsonAdapter implements JsonData {
  final XmlService _xmlService;

  XmlToJsonAdapter(this._xmlService);

  @override
  String getJson() {
    String xml = _xmlService.getXml();
    // Converti XML in JSON (versione semplificata)
    return '{"name": "John"}';
  }
}

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

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

XmlToJsonAdapter avvolge XmlService e implementa l’interfaccia JsonData. Il codice client lavora con la familiare interfaccia JsonData senza sapere che i dati provengono originariamente da una sorgente XML. L’adattatore gestisce internamente tutta la traduzione.

Usa il pattern Adapter quando vuoi usare una classe esistente ma la sua interfaccia non corrisponde a ciò di cui hai bisogno, oppure quando devi creare una classe riutilizzabile che collabori con classi dotate di interfacce incompatibili.

challenge icon

Sfida

Facile

Costruiamo un sistema adattatore per lettori multimediali! Immagina di avere un moderno sistema audio che si aspetta che tutte le sorgenti multimediali forniscano audio tramite un'interfaccia standard, ma devi integrare un vecchio giradischi in vinile che produce il suono in modo completamente diverso.

Creerai due file per organizzare l'implementazione del pattern adapter:

  • media_adapter.dart: questo file contiene l'interfaccia e le classi adattatore. Definisci una classe astratta AudioSource che il tuo sistema moderno si aspetta: deve avere un metodo String playAudio() che restituisce l'uscita audio come stringa. Poi crea una classe VinylPlayer che rappresenta l'apparecchiatura legacy: ha un campo trackName e un metodo String spinRecord() che restituisce *crackle* Playing vinyl: [trackName] *crackle*. Infine, crea un VinylAdapter che implementa AudioSource e avvolge un VinylPlayer. Il metodo playAudio() dell'adattatore dovrebbe chiamare il metodo spinRecord() del lettore in vinile e restituire il risultato, collegando così le interfacce incompatibili.
  • main.dart: importa il file dell'adattatore multimediale e mostra come l'adattatore consente al vecchio lettore in vinile di funzionare con codice che si aspetta l'interfaccia moderna AudioSource. Crea un VinylPlayer con il nome della traccia Bohemian Rhapsody. Poi crea un VinylAdapter che avvolge questo lettore in vinile. Memorizza l'adattatore in una variabile di tipo AudioSource per dimostrare che è conforme all'interfaccia prevista. Chiama playAudio() sulla tua sorgente audio e stampa il risultato.

La bellezza di questo pattern è che il codice principale funziona con l'interfaccia standard AudioSource: non ha bisogno di sapere che, dietro le quinte, è un vecchio lettore in vinile a svolgere il lavoro effettivo!

Output previsto:

*crackle* Playing vinyl: Bohemian Rhapsody *crackle*

Provalo tu

import 'media_adapter.dart';

void main() {
  // TODO: Crea un VinylPlayer con il nome del brano "Bohemian Rhapsody"
  
  // TODO: Crea un VinylAdapter che racchiuda il lettore di vinili
  
  // TODO: Memorizza l'adattatore in una variabile di tipo AudioSource
  
  // TODO: Chiama playAudio() sulla tua sorgente audio e stampa il risultato
  
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore Dart online