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.
Tantangan
MudahMari 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 classAudioSourceyang diharapkan oleh sistem modernmu. Class ini harus memiliki methodString playAudio()yang mengembalikan output audio sebagai string. Lalu, buat classVinylPlayeryang mewakili peralatan lama. Class ini memiliki fieldtrackNamedan methodString spinRecord()yang mengembalikan*crackle* Playing vinyl: [trackName] *crackle*. Terakhir, buatVinylAdapteryang mengimplementasikanAudioSourcedan membungkusVinylPlayer. MethodplayAudio()milik adapter harus memanggil methodspinRecord()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 antarmukaAudioSourcemodern. BuatVinylPlayerdengan nama laguBohemian Rhapsody. Lalu, buatVinylAdapteryang membungkus pemutar piringan hitam ini. Simpan adapter dalam variabel bertipeAudioSourceuntuk membuktikan bahwa adapter tersebut sesuai dengan antarmuka yang diharapkan. PanggilplayAudio()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
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
file Eksternallibrary dan ImporPengantar OOPClass dan ObjectKata kunci thismethodVariabel InstanceDasar-Dasar ConstructorRingkasan: Kalkulator Sederhana4Keamanan Null
Pengantar Keamanan NullBisa Null vs Tidak Bisa NullOperator ? dan !Kata Kunci late dan Keamanan NullOperator Penanganan NullKeamanan Null dalam classRangkuman: Sistem Profil Pengguna7class Abstrak & Antarmuka
class AbstrakMethod abstrakAntarmuka di DartAntarmuka ImplisitMengimplementasikan vs MemperluasBeberapa AntarmukaRingkasan: Kalkulator Bentuk10Koleksi dan Generik
Gambaran Umum list, set, dan MapKoleksi dengan Tipe AmanKelas GenerikMetode GenerikBatasan GenerikIterable dan IteratorUlasan: Penyimpanan Generik2Konstruktor dalam Dart
Konstruktor DefaultKonstruktor BernamaInitializer ListsKonstruktor KonstanKonstruktor FactoryKonstruktor RedirectingRangkuman, Pembuat Bentuk5Enkapsulasi
Member Publik vs PrivatKonvensi Prefiks _Privasi Tingkat libraryPendalaman Getter & SetterPenyembunyian InformasiRingkasan: Catatan Siswa8Mixin
Pengantar MixinMembuat MixinMenggunakan Beberapa MixinKata Kunci on pada MixinMixin vs. PewarisanMixin vs. InterfaceRangkuman: Sistem Hewan3Property Class
Anggota Instance vs StaticField Final dan ConstVariabel LateMethod dan Field StaticGetter dan SetterRangkuman: Pengelola Rekening Bank6Pewarisan
Pewarisan DasarKata Kunci superPenimpaan methodAnotasi @overrideKata Kunci class finalKonstruktor dan PewarisanRangkuman, Hierarki Karyawan9Polimorfisme
Dasar-Dasar PolimorfismePolimorfisme melalui AntarmukaPemeriksaan Tipe saat RuntimeOperator is & asKata Kunci KovarianRangkuman: Pemroses Pembayaran12OOP Asinkron
Futures & async/awaitDasar-Dasar StreamPengontrol StreamKonstruktor AsinkronAsync dalam Method ClassRangkuman: Pengambil Data15Pola Desain Bagian 2
Pola CommandPola AdapterPola DecoratorPola Template MethodPola StatePola CompositePola RepositoryLatihan sendiri: Compiler Dart online