Menu
CoddyTech

Pola Adapter

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Dart di Coddy. Pelajaran 95 dari 110.

Pola Adapter memungkinkan antarmuka yang tidak kompatibel untuk bekerja sama. Pola ini berperan sebagai jembatan antara dua class yang tidak dapat bekerja sama, dengan membungkus class yang sudah ada menggunakan antarmuka baru yang diharapkan oleh client. Pola ini sangat berguna saat mengintegrasikan library pihak ketiga atau kode lama ke dalam aplikasimu.

Bayangkan kamu memiliki sistem yang bekerja dengan data JSON, tetapi kamu perlu mengintegrasikan komponen yang hanya menghasilkan XML. Alih-alih mengubah salah satu class, kamu membuat adapter yang menerjemahkan di antara keduanya:

// Interface yang diharapkan sistemmu
abstract class JsonData {
  String getJson();
}

// Class lama dengan interface yang tidak kompatibel
class XmlService {
  String getXml() {
    return '<data><name>John</name></data>';
  }
}

// Adapter membuat XmlService kompatibel dengan JsonData
class XmlToJsonAdapter implements JsonData {
  final XmlService _xmlService;

  XmlToJsonAdapter(this._xmlService);

  @override
  String getJson() {
    String xml = _xmlService.getXml();
    // Ubah XML menjadi JSON (disederhanakan)
    return '{"name": "John"}';
  }
}

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

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

XmlToJsonAdapter membungkus XmlService dan mengimplementasikan antarmuka JsonData. Kode client bekerja dengan antarmuka JsonData yang sudah dikenal tanpa mengetahui bahwa data awalnya berasal dari sumber XML. Adapter menangani semua penerjemahan secara internal.

Gunakan pola Adapter saat kamu ingin menggunakan class yang sudah ada, tetapi antarmukanya tidak sesuai dengan kebutuhanmu, atau saat kamu perlu membuat class yang dapat digunakan kembali dan bekerja sama dengan class yang memiliki antarmuka yang tidak kompatibel.

challenge icon

Tantangan

Mudah

Mari bangun sistem adapter pemutar media! Bayangkan kamu punya sistem audio modern yang mengharuskan semua sumber media menyediakan audio melalui antarmuka standar, tetapi kamu perlu mengintegrasikan pemutar piringan hitam jadul yang menghasilkan suara dengan cara yang sama sekali berbeda.

Kamu akan membuat dua file untuk mengatur implementasi pola adapter:

  • media_adapter.dart: File ini berisi antarmuka dan class adapter. Definisikan abstract class AudioSource yang diharapkan oleh sistem modernmu. Class ini harus memiliki method String playAudio() yang mengembalikan output audio sebagai string. Lalu, buat class VinylPlayer yang mewakili peralatan lama. Class ini memiliki field trackName dan method String spinRecord() yang mengembalikan *crackle* Playing vinyl: [trackName] *crackle*. Terakhir, buat VinylAdapter yang mengimplementasikan AudioSource dan membungkus VinylPlayer. Method playAudio() milik adapter harus memanggil method spinRecord() milik pemutar piringan hitam dan mengembalikan hasilnya. Dengan begitu, antarmuka yang tidak kompatibel dapat dijembatani.
  • main.dart: Impor file adapter media milikmu dan tunjukkan bagaimana adapter membuat pemutar piringan hitam lama berfungsi dengan kode yang mengharapkan antarmuka AudioSource modern. Buat VinylPlayer dengan nama lagu Bohemian Rhapsody. Lalu, buat VinylAdapter yang membungkus pemutar piringan hitam ini. Simpan adapter dalam variabel bertipe AudioSource untuk membuktikan bahwa adapter tersebut sesuai dengan antarmuka yang diharapkan. Panggil playAudio() pada sumber audio milikmu dan cetak hasilnya.

Keunggulan pola ini adalah kode utamamu bekerja dengan antarmuka standar AudioSource. Kode tersebut tidak perlu mengetahui bahwa di balik layar, pemutar piringan hitam lama yang melakukan pekerjaan sebenarnya!

Output yang diharapkan:

*crackle* Playing vinyl: Bohemian Rhapsody *crackle*

Coba sendiri

import 'media_adapter.dart';

void main() {
  // TODO: Buat VinylPlayer dengan nama lagu "Bohemian Rhapsody"
  
  // TODO: Buat VinylAdapter yang membungkus pemutar vinil tersebut
  
  // TODO: Simpan adapter dalam variabel bertipe AudioSource
  
  // TODO: Panggil playAudio() pada sumber audiomu dan cetak hasilnya
  
}
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 Dart online