Menu
CoddyTech

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 Stripe

Adapter 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.

challenge icon

Tantangan

Mudah

Mari 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 interface TemperatureSensor yang diharapkan oleh aplikasi cuacamu. Interface ini harus memiliki method getTemperature(): float yang mengembalikan suhu dalam Celsius.
  • LegacySensor.php: Buat class LegacySensor yang 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(): float yang mengembalikan nilai Fahrenheit yang tersimpan
  • LegacySensorAdapter.php: Sertakan interface TemperatureSensor dan class LegacySensor. Buat class LegacySensorAdapter yang mengimplementasikan TemperatureSensor dan membungkus LegacySensor. Adapter-mu harus:
    • Menerima LegacySensor dalam constructornya
    • Mengimplementasikan getTemperature() dengan membaca nilai Fahrenheit dari sensor lama dan mengonversinya ke Celsius menggunakan rumus: (fahrenheit - 32) * 5 / 9
  • main.php: Sertakan file LegacySensorAdapter. Kamu akan menerima satu input: suhu dalam Fahrenheit.

    Buat LegacySensor dengan suhu input, lalu bungkus dengan LegacySensorAdapter. Panggil getTemperature() 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

?>
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 PHP online