Menu
Coddy logo textTech

Wzorzec adaptera

Część sekcji Programowanie obiektowe ścieżki Dart w Coddy. Lekcja 95 z 110.

Wzorzec Adapter pozwala współpracować niezgodnym interfejsom. Działa jak most między dwiema klasami, które w innym przypadku nie mogłyby ze sobą współpracować, opakowując istniejącą klasę w nowy interfejs oczekiwany przez klientów. Jest to szczególnie przydatne podczas integrowania bibliotek innych firm lub starszego kodu z aplikacją.

Wyobraź sobie, że masz system, który pracuje z danymi JSON, ale musisz zintegrować komponent, który generuje wyłącznie XML. Zamiast modyfikować którąkolwiek z klas, tworzysz adapter, który tłumaczy między nimi:

// Istniejący interfejs, którego oczekuje twój system
abstract class JsonData {
  String getJson();
}

// Starsza klasa z niekompatybilnym interfejsem
class XmlService {
  String getXml() {
    return '<data><name>John</name></data>';
  }
}

// Adapter zapewnia zgodność XmlService z JsonData
class XmlToJsonAdapter implements JsonData {
  final XmlService _xmlService;

  XmlToJsonAdapter(this._xmlService);

  @override
  String getJson() {
    String xml = _xmlService.getXml();
    // Konwertuj XML na JSON (uproszczone)
    return '{"name": "John"}';
  }
}

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

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

XmlToJsonAdapter opakowuje XmlService i implementuje interfejs JsonData. Kod klienta korzysta ze znanego interfejsu JsonData, nie wiedząc, że dane pierwotnie pochodziły ze źródła XML. Adapter obsługuje całe tłumaczenie wewnętrznie.

Użyj wzorca Adapter, gdy chcesz użyć istniejącej klasy, ale jej interfejs nie odpowiada temu, czego potrzebujesz, lub gdy chcesz utworzyć klasę wielokrotnego użytku, która współpracuje z klasami mającymi niekompatybilne interfejsy.

challenge icon

Wyzwanie

Łatwy

Zbudujmy system adaptera odtwarzacza multimediów! Wyobraź sobie, że masz nowoczesny system audio, który oczekuje, że wszystkie źródła multimediów będą dostarczać dźwięk za pośrednictwem standardowego interfejsu, ale musisz zintegrować staromodny gramofon, który wytwarza dźwięk w zupełnie inny sposób.

Utworzysz dwa pliki, aby uporządkować implementację wzorca adaptera:

  • media_adapter.dart: Ten plik zawiera interfejs i klasy adaptera. Zdefiniuj klasę abstrakcyjną AudioSource, której oczekuje Twój nowoczesny system — powinna mieć metodę String playAudio(), która zwraca wyjście audio jako ciąg znaków. Następnie utwórz klasę VinylPlayer reprezentującą starszy sprzęt — ma pole trackName oraz metodę String spinRecord(), która zwraca *crackle* Playing vinyl: [trackName] *crackle*. Na koniec zbuduj VinylAdapter, który implementuje AudioSource i opakowuje VinylPlayer. Metoda playAudio() adaptera powinna wywoływać metodę spinRecord() odtwarzacza winylowego i zwracać wynik — w ten sposób łączy niezgodne interfejsy.
  • main.dart: Zaimportuj plik adaptera multimediów i pokaż, jak adapter pozwala używać starego odtwarzacza winylowego w kodzie, który oczekuje nowoczesnego interfejsu AudioSource. Utwórz VinylPlayer z nazwą utworu Bohemian Rhapsody. Następnie utwórz VinylAdapter, który opakowuje ten odtwarzacz winylowy. Przypisz adapter do zmiennej typu AudioSource, aby wykazać, że jest zgodny z oczekiwanym interfejsem. Wywołaj playAudio() na źródle audio i wyświetl wynik.

Piękno tego wzorca polega na tym, że Twój główny kod korzysta ze standardowego interfejsu AudioSource — nie musi wiedzieć, że za kulisami faktyczną pracę wykonuje stary odtwarzacz winylowy!

Oczekiwany wynik:

*crackle* Playing vinyl: Bohemian Rhapsody *crackle*

Spróbuj swoich sił

import 'media_adapter.dart';

void main() {
  // TODO: Utwórz VinylPlayer z nazwą utworu "Bohemian Rhapsody"
  
  // TODO: Utwórz VinylAdapter, który opakowuje odtwarzacz winylowy
  
  // TODO: Zapisz adapter w zmiennej typu AudioSource
  
  // TODO: Wywołaj playAudio() na swoim źródle dźwięku i wyświetl wynik
  
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Dart online