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 (Adapter Pattern), uyumsuz arayüzlerin birlikte çalışmasına olanak tanıyan yapısal bir tasarım desenidir. Bir sınıfın arayüzünü istemcinin beklediği bir arayüz haline dönüştürerek iki sınıf arasında bir köprü görevi görür. Bunu, bir Avrupa cihazını Amerikan prizine takmanıza olanak tanıyan bir güç adaptörü gibi düşünebilirsiniz.

Ses dosyalarını oynatan mevcut bir MediaPlayer arayüzüne sahip olduğunuzu, ancak videoları oynatmak için tamamen farklı bir arayüz kullanan üçüncü taraf bir kütüphaneyi entegre etmeniz gerektiğini hayal edin:

// 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ı sarmalar ve beklenen arayüzü uygulayarak aralarındaki çağrıları çevirir:

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ü aracılığıyla kullanabilir:

MediaPlayer player = new VideoPlayerAdapter();
player.play("movie.mp4");  // Çıktı: Video oynatılıyor: movie.mp4

Adapter Deseni, kaynak kodlarını değiştirmeden eski kodları veya üçüncü taraf kütüphaneleri entegre ederken paha biçilemezdir. İstemci, uyarlanmış bir sınıfla çalıştığının farkında olmaz; sadece bildiği arayüzü kullanır.

challenge icon

Görev

Kolay

Adapter Pattern 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 okuma yapan eski bir sıcaklık sensörünü entegre etmeniz gerekiyor. Her iki sistemi de değiştirmek yerine, aradaki boşluğu dolduran bir adaptör oluşturacaksınız.

Kodunuzu dört dosya halinde düzenleyeceksiniz:

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

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

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

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

Örneğin, 98.6 girdisi ile çıktınız şöyle olacaktır:

Temperature: 37.0 C

Main sınıfınızın tamamen TemperatureProvider arayüzü ile nasıl çalıştığına dikkat edin; gerçek sıcaklığın arka planda uyarlanan bir Fahrenheit sensöründen geldiğine dair hiçbir fikri yoktur. Adapter Pattern'in zarafeti de 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: Girdi değeriyle bir FahrenheitSensor oluşturun
        
        // TODO: Sensörü sarmalayan bir SensorAdapter oluşturun
        
        // TODO: Adaptörü bir TemperatureProvider değişkeninde saklayın
        
        // TODO: Sıcaklığı Celsius cinsinden alın ve yazdırın
        // Format: "Temperature: [celsius] C" bir ondalık basamakla
        // İpucu: Biçimlendirme için String.format("%.1f", value) kullanın
    }
}
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