Pola Adapter
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan PHP di Coddy. Pelajaran 76 dari 91.
Adapter Pattern adalah pola desain struktural yang memungkinkan object dengan interface yang tidak kompatibel untuk bekerja bersama. Pola ini berfungsi sebagai jembatan antara dua interface, dengan menerjemahkan pemanggilan dari satu format ke format lainnya.
Bayangkan kamu sedang membuat aplikasi yang memproses pembayaran, dan kamu perlu mengintegrasikan library pembayaran pihak ketiga. Library tersebut berfungsi dengan sempurna, tetapi antarmukanya tidak cocok dengan yang diharapkan oleh kodemu. Alih-alih menulis ulang seluruh aplikasimu, kamu membuat adapter yang menerjemahkan antara keduanya.
<?php
// Interface yang diharapkan aplikasimu
interface PaymentProcessor {
public function pay(float $amount): string;
}
// library pihak ketiga dengan interface yang berbeda
class StripeAPI {
public function createCharge(int $cents, string $currency): string {
return "Charged {$cents} {$currency} via Stripe";
}
}
Adapter menerapkan antarmuka yang kamu harapkan sambil menggunakan class pihak ketiga secara internal:
<?php
class StripeAdapter implements PaymentProcessor {
public function __construct(private StripeAPI $stripe) {}
public function pay(float $amount): string {
$cents = (int)($amount * 100);
return $this->stripe->createCharge($cents, 'USD');
}
}
$stripe = new StripeAPI();
$processor = new StripeAdapter($stripe);
echo $processor->pay(29.99);
output:
Charged 2999 USD via StripeAdapter mengonversi dolar menjadi sen dan memanggil method yang sesuai. Kodemu hanya mengenal PaymentProcessor, tanpa perlu mengetahui persyaratan khusus Stripe. Jika nanti kamu beralih ke penyedia pembayaran lain, kamu cukup membuat adapter baru tanpa mengubah kodemu yang sudah ada.
Tantangan
MudahMari kita buat sistem konversi suhu menggunakan Adapter Pattern. Kamu memiliki sensor suhu lama yang menghasilkan pembacaan dalam Fahrenheit, tetapi aplikasi cuaca modernmu mengharapkan semua suhu dalam Celsius. Daripada mengubah salah satu sistem, kamu akan membuat adapter yang menjembatani perbedaan tersebut.
Kamu akan mengatur kodemu dalam empat file:
TemperatureSensor.php: Definisikan interfaceTemperatureSensoryang diharapkan oleh aplikasi cuacamu. Interface ini harus memiliki methodgetTemperature(): floatyang mengembalikan suhu dalam Celsius.LegacySensor.php: Buat classLegacySensoryang menyimulasikan perangkat keras lama. Class ini memiliki interface yang berbeda dari yang dibutuhkan aplikasimu:- Menerima pembacaan Fahrenheit dalam constructornya (gunakan promosi constructor)
- Memiliki method
readFahrenheit(): floatyang mengembalikan nilai Fahrenheit yang tersimpan
LegacySensorAdapter.php: Sertakan interface TemperatureSensor dan class LegacySensor. Buat classLegacySensorAdapteryang mengimplementasikanTemperatureSensordan membungkusLegacySensor. Adapter-mu harus:- Menerima
LegacySensordalam constructornya - Mengimplementasikan
getTemperature()dengan membaca nilai Fahrenheit dari sensor lama dan mengonversinya ke Celsius menggunakan rumus:(fahrenheit - 32) * 5 / 9
- Menerima
main.php: Sertakan file LegacySensorAdapter. Kamu akan menerima satu input: suhu dalam Fahrenheit.Buat
LegacySensordengan suhu input, lalu bungkus denganLegacySensorAdapter. PanggilgetTemperature()pada adapter dan cetak hasilnya setelah dibulatkan hingga dua angka di belakang koma.Format outputnya:
Temperature: [celsius]C
Tantangan ini menunjukkan bagaimana Adapter Pattern memungkinkanmu mengintegrasikan interface yang tidak kompatibel tanpa mengubah kode yang sudah ada. Aplikasi cuacamu hanya bekerja dengan interface TemperatureSensor, tanpa mengetahui bahwa pembacaan sebenarnya berasal dari sensor Fahrenheit lama.
Coba sendiri
<?php
require_once 'LegacySensorAdapter.php';
// Baca input
$fahrenheit = floatval(trim(fgets(STDIN)));
// TODO: Buat LegacySensor dengan suhu input
// TODO: Bungkus dengan LegacySensorAdapter
// TODO: Panggil getTemperature() pada adapter
// TODO: Cetak hasil yang dibulatkan hingga dua angka di belakang koma
// Format output: Temperature: [celsius]C
?>Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalPengenalan OOPclass vs objectKata Kunci $thismethodpropertyConstructor (__construct)Destructor (__destruct)Ringkasan: Kalkulator Sederhana4Pewarisan
Pewarisan DasarKata Kunci parent::Penimpaan methodKata Kunci finalClass AbstrakRingkasan: Hierarki Karyawan7Enkapsulasi
Public, Protected, PrivateModifier Akses secara MendalamGetter dan SetterPenyembunyian InformasiPromosi Constructor (8.0)Ulasan: Sistem Catatan Siswa10Konsep OOP Lanjutan
Komposisi vs PewarisanInjeksi Dependensiclass AnonimEnum (PHP 8.1)Fiber (PHP 8.1)Pendalaman Kloning objectGenerator dan Iterator13Pola Desain Bagian 2
Pola PerintahPola AdapterPola DecoratorPola Template MethodPola StatePola CompositePola Repository2Namespace dan Autoloading
Pengenalan NamespaceKata Kunci useStandar Autoloading PSR-4Autoloader ComposerRingkasan: Proyek yang Terorganisasi5Interface dan Kontrak
Pengenalan InterfaceMengimplementasikan InterfaceImplementasi Beberapa InterfaceInterface vs Abstract ClassPetunjuk Tipe dengan InterfaceRekap: Kalkulator Bentuk8Magic Methods
Pengantar Magic Methods__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Cloning Object__serialize & __unserializeRingkasan: Koleksi Kustom11Sistem Tipe Data dan Penanganan Error
Deklarasi TipeTipe NullableTipe Union dan IntersectionClass ExceptionHierarki Exception KustomTry, Catch, FinallyRekap: Validator Form3Property dalam class
Property instance vs staticKonstanta dalam classMethod & property staticProperty private & protectedProperty readonly (PHP 8.1)Ulasan: Pengelola Rekening Bank6Polimorfisme
Meninjau Kembali Method OverridingPolimorfisme melalui AntarmukaPetunjuk Tipe dan Tipe UnionPengikatan Statis TertundaRangkuman: Pemroses PembayaranLatihan sendiri: Compiler PHP online