Menu
CoddyTech

Pola Adapter

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Java di Coddy. Pelajaran 71 dari 87.

Adapter Pattern adalah pola desain struktural yang memungkinkan antarmuka yang tidak kompatibel bekerja bersama. Pola ini bertindak sebagai jembatan antara dua class, dengan mengubah antarmuka salah satu class menjadi antarmuka yang diharapkan oleh client. Bayangkan seperti adaptor daya yang memungkinkan kamu mencolokkan perangkat Eropa ke stopkontak Amerika.

Bayangkan kamu memiliki interface MediaPlayer yang sudah ada untuk memutar file audio, tetapi kamu perlu mengintegrasikan library pihak ketiga yang menggunakan interface yang sama sekali berbeda untuk memutar video:

// Interface yang sudah digunakan kodemu
interface MediaPlayer {
    void play(String filename);
}

// class pihak ketiga dengan interface yang tidak kompatibel
class AdvancedVideoPlayer {
    public void playVideo(String filename) {
        System.out.println("Playing video: " + filename);
    }
}

Adapter membungkus class yang tidak kompatibel dan mengimplementasikan antarmuka yang diharapkan, dengan menerjemahkan pemanggilan di antara keduanya:

class VideoPlayerAdapter implements MediaPlayer {
    private AdvancedVideoPlayer videoPlayer;
    
    public VideoPlayerAdapter() {
        this.videoPlayer = new AdvancedVideoPlayer();
    }
    
    public void play(String filename) {
        videoPlayer.playVideo(filename);
    }
}

Sekarang, kode client-mu dapat menggunakan pemutar video melalui antarmuka MediaPlayer yang sudah dikenal:

MediaPlayer player = new VideoPlayerAdapter();
player.play("movie.mp4");  // output: Playing video: movie.mp4

Pola Adapter sangat berguna saat mengintegrasikan kode lama atau library pihak ketiga tanpa mengubah kode sumbernya. Client tidak menyadari bahwa ia bekerja dengan class yang telah diadaptasi. Client cukup menggunakan antarmuka yang sudah dikenalnya.

challenge icon

Tantangan

Mudah

Mari buat sistem konversi suhu menggunakan Pola Adapter! Kamu memiliki aplikasi cuaca yang sudah ada dan bekerja dengan suhu Celsius, tetapi kamu perlu mengintegrasikan sensor suhu lama yang hanya menghasilkan pembacaan dalam Fahrenheit. Alih-alih mengubah salah satu sistem, kamu akan membuat adapter yang menjembatani keduanya.

Kamu akan mengatur kodemu dalam empat file:

  • TemperatureProvider.java: Definisikan interface yang diharapkan oleh aplikasi cuacamu. Interface ini harus mendeklarasikan method getTemperatureCelsius() yang mengembalikan double yang mewakili suhu dalam Celsius.
  • FahrenheitSensor.java: Ini mewakili sensor lama dengan interface yang tidak kompatibel. Buat class dengan field double privat untuk suhu dalam Fahrenheit, yang diatur melalui constructor. Class ini harus memiliki method readFahrenheit() yang mengembalikan nilai Fahrenheit yang tersimpan.
  • SensorAdapter.java: Buat adapter yang membuat sensor Fahrenheit kompatibel dengan aplikasi cuacamu. Adapter-mu harus mengimplementasikan TemperatureProvider dan membungkus sebuah FahrenheitSensor. Saat getTemperatureCelsius() dipanggil, adapter harus membaca suhu dari sensor dan mengonversi nilainya ke Celsius menggunakan rumus: (fahrenheit - 32) * 5 / 9.
  • Main.java: Satukan semuanya! Kamu akan menerima satu input: pembacaan suhu dalam Fahrenheit (double).

    Buat FahrenheitSensor dengan nilai input tersebut. Lalu buat SensorAdapter yang membungkus sensor ini. Simpan adapter dalam variabel TemperatureProvider untuk menunjukkan bahwa aplikasi cuacamu dapat menggunakannya melalui interface yang diharapkan.

    Cetak hasil dengan format ini: Temperature: [celsius] C, dengan celsius diformat hingga satu angka di belakang koma.

Kamu akan menerima satu input: suhu Fahrenheit (double).

Contohnya, dengan input 98.6, output-mu akan menjadi:

Temperature: 37.0 C

Perhatikan bahwa class Main bekerja sepenuhnya dengan interface TemperatureProvider. Class ini tidak mengetahui bahwa suhu sebenarnya berasal dari sensor Fahrenheit yang diadaptasi di balik layar. Inilah keunggulan Pola Adapter!

Coba sendiri

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        double fahrenheit = scanner.nextDouble();
        
        // TODO: Buat FahrenheitSensor dengan nilai input
        
        // TODO: Buat SensorAdapter yang membungkus sensor
        
        // TODO: Simpan adapter dalam variabel TemperatureProvider
        
        // TODO: Ambil suhu dalam Celsius dan cetak hasilnya
        // Format: "Temperature: [celsius] C" dengan satu angka di belakang koma
        // Petunjuk: Gunakan String.format("%.1f", value) untuk pemformatan
    }
}
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 Java online