Menu
CoddyTech

Pola Adapter

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan C# di Coddy. Pelajaran 57 dari 70.

Pola Adapter adalah pola struktural yang memungkinkan interface yang tidak kompatibel bekerja sama. Pola ini berperan sebagai jembatan antara dua class, mengubah interface suatu class menjadi interface yang diharapkan client. Bayangkan seperti adaptor daya yang memungkinkan kamu mencolokkan perangkat Eropa ke stopkontak Amerika.

Pola ini sangat berguna saat kamu ingin menggunakan class yang sudah ada, tetapi antarmukanya tidak sesuai dengan kebutuhan kodemu. Alih-alih mengubah class aslinya (yang mungkin tidak dapat kamu kendalikan), kamu membuat adapter yang membungkusnya:

// class yang sudah ada dengan interface yang tidak kompatibel
public class OldPrinter
{
    public void PrintMessage(string msg) => Console.WriteLine($"Old: {msg}");
}

// Interface yang diharapkan kodemu
public interface IPrinter
{
    void Print(string text);
}

// Adapter menjembatani perbedaan ini
public class PrinterAdapter : IPrinter
{
    private OldPrinter _oldPrinter;
    
    public PrinterAdapter(OldPrinter oldPrinter)
    {
        _oldPrinter = oldPrinter;
    }
    
    public void Print(string text)
    {
        _oldPrinter.PrintMessage(text);  // Meneruskan tugas ke interface lama
    }
}

Sekarang kodemu dapat bekerja dengan printer lama melalui antarmuka yang diharapkan:

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

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

Pola Adapter sangat berguna saat mengintegrasikan library pihak ketiga atau kode lama ke dalam aplikasimu. Kode client bekerja dengan antarmuka IPrinter, tanpa mengetahui bahwa class lama yang tidak kompatibel melakukan pekerjaan sebenarnya di balik layar.

challenge icon

Tantangan

Mudah

Mari bangun sistem pemutar media menggunakan pola Adapter. Kamu memiliki library audio yang sudah ada dan memutar file MP3, tetapi aplikasi kamu memerlukan antarmuka terpadu yang dapat menangani berbagai jenis media. Kamu akan membuat adapter untuk menjembatani kesenjangan ini, sehingga pemutar media modernmu dapat bekerja dengan lancar bersama library audio lama.

Kamu akan mengatur kodemu dalam tiga file:

  • LegacyAudio.cs: File ini merepresentasikan library yang sudah ada dan tidak dapat kamu ubah. Buat class LegacyAudioPlayer di namespace MediaSystem dengan method PlayMp3(string filename) yang mengembalikan string "Playing MP3: {filename}". Ini adalah "adaptee"-mu, yaitu class dengan antarmuka yang tidak kompatibel.
  • MediaAdapter.cs: Buat interface dan adapter dalam namespace yang sama. Definisikan interface IMediaPlayer dengan method Play(string filename) yang mengembalikan string. Lalu buat class MediaPlayerAdapter yang mengimplementasikan IMediaPlayer. Adapter-mu harus membungkus instance LegacyAudioPlayer (yang diberikan melalui konstruktor) dan menerjemahkan pemanggilan Play menjadi pemanggilan method PlayMp3 milik pemutar lama.
  • Program.cs: Satukan semuanya dengan membuat pemutar lama, membungkusnya dalam adapter, dan menggunakan adapter melalui interface IMediaPlayer. Ini menunjukkan bagaimana kode client dapat menggunakan antarmuka modern sementara adapter menangani komunikasi dengan sistem lama di balik layar.

Kamu akan menerima satu input:

  • Nama file yang akan diputar (misalnya, song.mp3)

Buat LegacyAudioPlayer, bungkus dengan MediaPlayerAdapter, lalu panggil Play pada adapter menggunakan interface IMediaPlayer dan cetak hasilnya.

Misalnya, jika inputnya adalah favorite_track.mp3, outputnya akan seperti ini:

Playing MP3: favorite_track.mp3

Keunggulan pola ini adalah kode utama hanya berinteraksi dengan IMediaPlayer, tanpa mengetahui bahwa library audio lama yang melakukan pekerjaan sebenarnya. Jika nanti kamu perlu mendukung library lama yang berbeda, kamu cukup membuat adapter baru tanpa mengubah kode client apa pun!

Coba sendiri

using System;
using MediaSystem;

class Program
{
    public static void Main(string[] args)
    {
        // Baca input nama file
        string filename = Console.ReadLine();
        
        // TODO: Buat instance LegacyAudioPlayer
        
        // TODO: Bungkus instance tersebut dalam MediaPlayerAdapter
        
        // TODO: Gunakan adapter melalui antarmuka IMediaPlayer
        // dan cetak hasil pemanggilan Play dengan nama file tersebut
    }
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler C# online