Menu
Coddy logo textTech

Wzorzec adaptera

Część sekcji Programowanie obiektowe ścieżki C# w Coddy. Lekcja 57 z 70.

Wzorzec Adapter to wzorzec strukturalny, który umożliwia współpracę niezgodnych interfejsów. Działa jak most między dwiema klasami, przekształcając interfejs jednej klasy w interfejs oczekiwany przez klientów. Możesz myśleć o nim jak o adapterze zasilania, który pozwala podłączyć europejskie urządzenie do amerykańskiego gniazdka.

Ten wzorzec jest szczególnie przydatny, gdy chcesz użyć istniejącej klasy, ale jej interfejs nie pasuje do potrzeb Twojego kodu. Zamiast modyfikować oryginalną klasę (nad którą możesz nie mieć kontroli), tworzysz adapter, który ją opakowuje:

// Istniejąca klasa z niekompatybilnym interfejsem
public class OldPrinter
{
    public void PrintMessage(string msg) => Console.WriteLine($"Old: {msg}");
}

// Interfejs, którego oczekuje twój kod
public interface IPrinter
{
    void Print(string text);
}

// Adapter łączy niekompatybilne interfejsy
public class PrinterAdapter : IPrinter
{
    private OldPrinter _oldPrinter;
    
    public PrinterAdapter(OldPrinter oldPrinter)
    {
        _oldPrinter = oldPrinter;
    }
    
    public void Print(string text)
    {
        _oldPrinter.PrintMessage(text);  // Deleguje wywołanie do starego interfejsu
    }
}

Teraz Twój kod może współpracować ze starą drukarką za pośrednictwem oczekiwanego interfejsu:

OldPrinter legacy = new OldPrinter();
IPrinter printer = new PrinterAdapter(legacy);

printer.Print("Hello");  // Old: Hello

Wzorzec Adapter jest nieoceniony podczas integrowania bibliotek innych firm lub starszego kodu z aplikacją. Kod klienta współpracuje z interfejsem IPrinter, nie zdając sobie sprawy, że za kulisami całą pracę wykonuje stara, niekompatybilna klasa.

challenge icon

Wyzwanie

Łatwy

Zbudujmy system odtwarzacza multimediów z użyciem wzorca Adapter. Masz istniejącą bibliotekę audio, która odtwarza pliki MP3, ale Twoja aplikacja potrzebuje ujednoliconego interfejsu, który obsługuje różne typy multimediów. Utworzysz adapter, który wypełni tę lukę, umożliwiając nowoczesnemu odtwarzaczowi multimediów bezproblemową współpracę ze starszą biblioteką audio.

Rozmieścisz kod w trzech plikach:

  • LegacyAudio.cs: Reprezentuje istniejącą bibliotekę, której nie możesz modyfikować. Utwórz klasę LegacyAudioPlayer w przestrzeni nazw MediaSystem, z metodą PlayMp3(string filename), która zwraca ciąg znaków "Playing MP3: {filename}". To Twój „adaptowany obiekt” — klasa z niezgodnym interfejsem.
  • MediaAdapter.cs: Utwórz interfejs i adapter w tej samej przestrzeni nazw. Zdefiniuj interfejs IMediaPlayer z metodą Play(string filename), która zwraca ciąg znaków. Następnie utwórz klasę MediaPlayerAdapter, która implementuje IMediaPlayer. Adapter powinien opakowywać instancję LegacyAudioPlayer (przekazaną przez konstruktor) i przekierowywać wywołanie Play do metody PlayMp3 starszego odtwarzacza.
  • Program.cs: Połącz wszystko, tworząc starszy odtwarzacz, opakowując go w adapter i korzystając z adaptera za pośrednictwem interfejsu IMediaPlayer. To pokazuje, jak kod klienta może korzystać z nowoczesnego interfejsu, podczas gdy adapter w tle obsługuje komunikację ze starszym systemem.

Otrzymasz jedno wejście:

  • Nazwę pliku do odtworzenia (np. song.mp3)

Utwórz obiekt LegacyAudioPlayer, opakuj go w MediaPlayerAdapter, a następnie wywołaj Play na adapterze za pośrednictwem interfejsu IMediaPlayer i wypisz wynik.

Na przykład, jeśli wejściem jest favorite_track.mp3, wynikiem powinno być:

Playing MP3: favorite_track.mp3

Piękno tego wzorca polega na tym, że główny kod korzysta wyłącznie z IMediaPlayer — nie wie, że faktyczną pracę wykonuje starsza biblioteka audio. Jeśli później zechcesz obsłużyć inną starszą bibliotekę, wystarczy utworzyć nowy adapter, nie zmieniając żadnego kodu klienta!

Spróbuj swoich sił

using System;
using MediaSystem;

class Program
{
    public static void Main(string[] args)
    {
        // Odczytaj wprowadzoną nazwę pliku
        string filename = Console.ReadLine();
        
        // TODO: Utwórz instancję LegacyAudioPlayer
        
        // TODO: Umieść ją w MediaPlayerAdapter
        
        // TODO: Użyj adaptera przez interfejs IMediaPlayer
        // i wypisz wynik wywołania Play z nazwą pliku
    }
}
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 C# online