Menu
Coddy logo textTech

Adaptör Kalıbı

Coddy'nin Java Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 71 / 87.

Adaptör Deseni, uyumsuz arayüzlerin birlikte çalışmasını sağlayan yapısal bir tasarım desenidir. İki sınıf arasında köprü görevi görerek bir sınıfın arayüzünü istemcinin beklediği arayüze dönüştürür. Bunu, Avrupa tipi bir cihazı Amerika tipi bir prize takmanızı sağlayan bir güç adaptörü gibi düşünebilirsiniz.

Ses dosyalarını oynatan mevcut bir MediaPlayer arayüzünüz olduğunu, ancak videoları oynatmak için tamamen farklı bir arayüz kullanan üçüncü taraf bir kitaplığı entegre etmeniz gerektiğini düşünün:

// Kodunuzun kullandığı mevcut arayüz
interface MediaPlayer {
    void play(String filename);
}

// Uyumsuz arayüze sahip üçüncü taraf sınıf
class AdvancedVideoPlayer {
    public void playVideo(String filename) {
        System.out.println("Playing video: " + filename);
    }
}

Adaptör, uyumsuz sınıfı sarar ve beklenen arayüzü uygular; aralarındaki çağrıları dönüştürür:

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

Artık istemci kodunuz video oynatıcıyı tanıdık MediaPlayer arayüzü üzerinden kullanabilir:

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

Adaptör Deseni, eski kodu veya üçüncü taraf kütüphaneleri kaynak kodlarını değiştirmeden entegre ederken son derece değerlidir. İstemci, uyarlanmış bir sınıfla çalıştığının farkında değildir. Yalnızca bildiği arayüzü kullanır.

challenge icon

Görev

Kolay

Adapter Pattern'i kullanarak bir sıcaklık dönüştürme sistemi oluşturalım! Celsius sıcaklıklarıyla çalışan mevcut bir hava durumu uygulamanız var, ancak yalnızca Fahrenheit cinsinden ölçümler veren eski bir sıcaklık sensörünü entegre etmeniz gerekiyor. Sistemlerden herhangi birini değiştirmek yerine, aradaki uyumsuzluğu gideren bir adapter oluşturacaksınız.

Kodunuzu dört dosyaya ayıracaksınız:

  • TemperatureProvider.java: Hava durumu uygulamanızın beklediği arayüzü tanımlayın. Celsius cinsinden sıcaklığı temsil eden bir double döndüren getTemperatureCelsius() metodunu bildirmelidir.
  • FahrenheitSensor.java: Bu sınıf, uyumsuz bir arayüze sahip eski sensörü temsil eder. Fahrenheit cinsinden sıcaklık için private bir double alanı olan bir sınıf oluşturun; bu alan constructor aracılığıyla ayarlanmalıdır. Saklanan Fahrenheit değerini döndüren readFahrenheit() metoduna sahip olmalıdır.
  • SensorAdapter.java: Fahrenheit sensörünü hava durumu uygulamanızla uyumlu hâle getiren adapter'ı oluşturun. Adapter'ınız TemperatureProvider arayüzünü uygulamalı ve bir FahrenheitSensor sarmalamalıdır. getTemperatureCelsius() çağrıldığında sensörden okumalı ve şu formülü kullanarak değeri Celsius'a dönüştürmelidir: (fahrenheit - 32) * 5 / 9.
  • Main.java: Her şeyi bir araya getirin! Bir adet girdi alacaksınız: Fahrenheit cinsinden sıcaklık değeri (double).

    Girdi değerini kullanarak bir FahrenheitSensor oluşturun. Ardından bu sensörü sarmalayan bir SensorAdapter oluşturun. Hava durumu uygulamanızın beklenen arayüz üzerinden kullanabildiğini göstermek için adapter'ı bir TemperatureProvider değişkeninde saklayın.

    Sonucu şu formatta yazdırın: Temperature: [celsius] C; burada celsius, bir ondalık basamakla biçimlendirilmelidir.

Bir girdi alacaksınız: Fahrenheit sıcaklığı (double).

Örneğin, giriş 98.6 olduğunda çıktınız şu şekilde olacaktır:

Temperature: 37.0 C

TemperatureProvider arayüzüyle tamamen çalışan Main sınıfınızın, gerçek sıcaklığın arka planda uyarlanan bir Fahrenheit sensöründen geldiğini bilmediğine dikkat edin. Adapter Pattern'in zarafeti işte budur!

Kendin dene

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        double fahrenheit = scanner.nextDouble();
        
        // TODO: Giriş değeriyle bir FahrenheitSensor oluştur
        
        // TODO: Sensörü saran bir SensorAdapter oluştur
        
        // TODO: Adaptörü bir TemperatureProvider değişkeninde sakla
        
        // TODO: Sıcaklığı Celsius cinsinden al ve yazdır
        // Biçim: "Temperature: [celsius] C" bir ondalık basamakla
        // İpucu: Biçimlendirme için String.format("%.1f", value) kullan
    }
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online Java derleyicisi