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.mp4Adaptö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.
Görev
KolayAdapter 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ürengetTemperatureCelsius()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ürenreadFahrenheit()metoduna sahip olmalıdır.SensorAdapter.java: Fahrenheit sensörünü hava durumu uygulamanızla uyumlu hâle getiren adapter'ı oluşturun. Adapter'ınızTemperatureProviderarayüzünü uygulamalı ve birFahrenheitSensorsarmalamalı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
FahrenheitSensoroluşturun. Ardından bu sensörü sarmalayan birSensorAdapteroluşturun. Hava durumu uygulamanızın beklenen arayüz üzerinden kullanabildiğini göstermek için adapter'ı birTemperatureProviderdeğ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 CTemperatureProvider 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
}
}
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
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar KelimesiMetotlarAlanlar (Öznitelikler)Yapıcı MetotYapıcı Metot Aşırı YüklemeÖzet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtım (extends)super Anahtar KelimesiMetot Geçersiz Kılma (@Override)Yapıcı Metot ZincirlemeObject SınıfıTekli ve Çok Seviyeli KalıtımNeden Çoklu Sınıf Kalıtımı Yok?Özet - Çalışan Hiyerarşisi7Özel Metotlar ve Object Sınıfı
toString() Metoduequals() ve hashCode()clone() MetoducompareTo() ve ComparableComparator ArayüzüÖzet - Özel Sıralama2Erişim Belirleyiciler ve Kapsülleme
Erişim Seviyelerine Genel BakışGetter ve Setter MetotlarıBilgi Gizlemefinal Anahtar KelimesiÖzet - Banka Hesabı Yöneticisi5Polimorfizm
Metot Aşırı Yükleme TemelleriMetot Geçersiz Kılma (Çalışma Zamanı)Upcasting ve Downcastinginstanceof OperatörüSoyut Sınıflar ve MetotlarÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kompozisyon vs KalıtımAgregasyon vs KompozisyonDahili, Yuvalanmış ve Anonim SınıflarEnum'lar ve Enum MetotlarıRecords (Java 16+)Sealed Classes (Java 17+)11Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıBuilder KalıbıObserver KalıbıStrategy Kalıbı14Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi3Sınıf Özellikleri ve Statik Üyeler
Instance ve Statik DeğişkenlerStatik MetotlarStatik BloklarSabitler (static final)Özet - Sayaç ve Utility6Arayüzler ve Soyut Sınıflar
Arayüzlere GirişArayüzleri UygulamaÇoklu Arayüz UygulamaArayüzlerde Default ve StaticSoyut Sınıflar ve ArayüzlerFonksiyonel ArayüzlerÖzet - Ödeme Sistemi9Generics
Generics'e GirişGeneric SınıflarGeneric MetotlarSınırlandırılmış Tip ParametreleriWildcard'lar (?, extends, super)Özet - Generic Container12Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıYineleyici KalıbıKendi başına pratik yap: Online Java derleyicisi