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: HelloPola 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.
Tantangan
MudahMari 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 classLegacyAudioPlayerdi namespaceMediaSystemdengan methodPlayMp3(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 interfaceIMediaPlayerdengan methodPlay(string filename)yang mengembalikan string. Lalu buat classMediaPlayerAdapteryang mengimplementasikanIMediaPlayer. Adapter-mu harus membungkus instanceLegacyAudioPlayer(yang diberikan melalui konstruktor) dan menerjemahkan pemanggilanPlaymenjadi pemanggilan methodPlayMp3milik pemutar lama.Program.cs: Satukan semuanya dengan membuat pemutar lama, membungkusnya dalam adapter, dan menggunakan adapter melalui interfaceIMediaPlayer. 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.mp3Keunggulan 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
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalNamespace & DirektifPengantar class & objectKata Kunci 'this'Method dan ParameterField vs PropertyKonstruktorInisialisasi objectRingkasan: Kalkulator Sederhana4Pewarisan
Sintaks Dasar Pewarisan (:)Kata Kunci 'base'Kata Kunci Virtual & OverrideClass SealedBase Class 'object'Rangkuman: Hierarki Karyawan7Fitur Lanjutan
Overloading OperatorIndexer (this[])Penimpaan ToString()Extension methodRingkasan: Custom list2Property & Anggota Statis
Property yang Diimplementasikan OtomatisProperty Hanya Baca dan Hanya TulisField dan method StatisClass StatisAnggota Berbentuk Ekspresi5Polimorfisme & Antarmuka
Polimorfisme saat kompilasi vs runtimeAntarmuka vs kelas abstrakBeberapa antarmukaAntarmuka eksplisitUpcasting & DowncastingRingkasan, Kalkulator Bentuk8Konsep OOP Lanjutan
Komposisi daripada PewarisanGenerics (class dan method)Delegate dan EventAtribut dan ReflectionIDisposable dan Pernyataan usingDasar-Dasar Dependency Injection11Pola Desain Bagian 2
Pola PerintahPola AdapterPola DecoratorPola Template MethodPola StatePola CompositeLatihan sendiri: Compiler C# online