Menu
Coddy logo textTech

Adapter-Muster

Teil des Abschnitts Objektorientierte Programmierung der Dart-Journey von Coddy. Lektion 95 von 110.

Das Adaptermuster ermöglicht es inkompatiblen Schnittstellen, zusammenzuarbeiten. Es fungiert als Brücke zwischen zwei Klassen, die andernfalls nicht zusammenarbeiten könnten, indem es eine vorhandene Klasse mit einer neuen Schnittstelle umschließt, die Clients erwarten. Dies ist besonders nützlich, wenn du Bibliotheken von Drittanbietern oder Legacy-Code in deine Anwendung integrierst.

Stell dir vor, du hast ein System, das mit JSON-Daten arbeitet, aber du musst eine Komponente integrieren, die nur XML ausgibt. Anstatt eine der beiden Klassen zu ändern, erstellst du einen Adapter, der zwischen ihnen übersetzt:

// Bestehende Schnittstelle, die Ihr System erwartet
abstract class JsonData {
  String getJson();
}

// Legacy-Klasse mit inkompatibler Schnittstelle
class XmlService {
  String getXml() {
    return '<data><name>John</name></data>';
  }
}

// Adapter macht XmlService kompatibel mit JsonData
class XmlToJsonAdapter implements JsonData {
  final XmlService _xmlService;

  XmlToJsonAdapter(this._xmlService);

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

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

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

Der XmlToJsonAdapter kapselt den XmlService und implementiert die JsonData-Schnittstelle. Der Client-Code arbeitet mit der vertrauten JsonData-Schnittstelle, ohne zu wissen, dass die Daten ursprünglich aus einer XML-Quelle stammen. Der Adapter übernimmt die gesamte Übersetzung intern.

Verwende das Adapter-Muster, wenn du eine vorhandene Klasse verwenden möchtest, ihre Schnittstelle jedoch nicht deinen Anforderungen entspricht, oder wenn du eine wiederverwendbare Klasse erstellen musst, die mit Klassen mit inkompatiblen Schnittstellen zusammenarbeitet.

challenge icon

Aufgabe

Einfach

Erstellen wir ein Adapter-System für einen Mediaplayer! Stell dir vor, du hast ein modernes Audiosystem, das erwartet, dass alle Medienquellen Audio über eine Standardschnittstelle bereitstellen, aber du musst einen altmodischen Schallplattenspieler integrieren, der eine völlig andere Art der Klangerzeugung verwendet.

Du wirst zwei Dateien erstellen, um deine Implementierung des Adaptermusters zu organisieren:

  • media_adapter.dart: Diese Datei enthält deine Schnittstellen- und Adapterklassen. Definiere eine abstrakte Klasse AudioSource, die dein modernes System erwartet – sie sollte eine Methode String playAudio() besitzen, die die Audioausgabe als String zurückgibt. Erstelle anschließend eine Klasse VinylPlayer, die die Legacy-Ausrüstung repräsentiert – sie verfügt über ein Feld trackName und eine Methode String spinRecord(), die *crackle* Playing vinyl: [trackName] *crackle* zurückgibt. Erstelle schließlich einen VinylAdapter, der AudioSource implementiert und einen VinylPlayer kapselt. Die Methode playAudio() des Adapters sollte die Methode spinRecord() des Schallplattenspielers aufrufen und das Ergebnis zurückgeben – so werden die inkompatiblen Schnittstellen überbrückt.
  • main.dart: Importiere deine Media-Adapter-Datei und demonstriere, wie der Adapter den alten Schallplattenspieler mit Code funktionieren lässt, der die moderne Schnittstelle AudioSource erwartet. Erstelle einen VinylPlayer mit dem Titelnamen Bohemian Rhapsody. Erstelle anschließend einen VinylAdapter, der diesen Schallplattenspieler kapselt. Speichere den Adapter in einer Variablen vom Typ AudioSource, um zu beweisen, dass er der erwarteten Schnittstelle entspricht. Rufe playAudio() für deine Audioquelle auf und gib das Ergebnis aus.

Das Schöne an diesem Muster ist, dass dein Hauptcode mit der standardmäßigen Schnittstelle AudioSource arbeitet – er muss nicht wissen, dass im Hintergrund tatsächlich ein alter Schallplattenspieler die Arbeit übernimmt!

Erwartete Ausgabe:

*crackle* Playing vinyl: Bohemian Rhapsody *crackle*

Probier es selbst

import 'media_adapter.dart';

void main() {
  // TODO: Erstelle einen VinylPlayer mit dem Tracknamen "Bohemian Rhapsody"
  
  // TODO: Erstelle einen VinylAdapter, der den VinylPlayer umhüllt
  
  // TODO: Speichere den Adapter in einer Variable vom Typ AudioSource
  
  // TODO: Rufe playAudio() auf deiner AudioSource auf und gib das Ergebnis aus
  
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-Dart-Compiler