Adaptör Kalıbı
Coddy'nin Dart Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 95 / 110.
Adapter deseni, uyumsuz arayüzlerin birlikte çalışmasına olanak tanır. Aksi takdirde iş birliği yapamayacak olan iki sınıf arasında bir köprü görevi görür ve mevcut bir sınıfı istemcilerin beklediği yeni bir arayüzle sarmalar. Bu, özellikle üçüncü taraf kütüphaneleri veya eski kodları uygulamanıza entegre ederken kullanışlıdır.
JSON verileriyle çalışan bir sisteminiz olduğunu hayal edin, ancak yalnızca XML çıktısı veren bir bileşeni entegre etmeniz gerekiyor. Her iki sınıfı da değiştirmek yerine, aralarında çeviri yapan bir adaptör oluşturursunuz:
// Sisteminizin beklediği mevcut arayüz
abstract class JsonData {
String getJson();
}
// Uyumsuz arayüze sahip eski (legacy) sınıf
class XmlService {
String getXml() {
return '<data><name>John</name></data>';
}
}
// Adapter, XmlService'i JsonData ile uyumlu hale getirir
class XmlToJsonAdapter implements JsonData {
final XmlService _xmlService;
XmlToJsonAdapter(this._xmlService);
@override
String getJson() {
String xml = _xmlService.getXml();
// XML'i JSON'a dönüştür (basitleştirilmiş)
return '{"name": "John"}';
}
}
void main() {
var xmlService = XmlService();
var adapter = XmlToJsonAdapter(xmlService);
print(adapter.getJson()); // {"name": "John"}
}XmlToJsonAdapter, XmlService'i sarmalar ve JsonData arayüzünü uygular. İstemci kodu, verinin başlangıçta bir XML kaynağından geldiğini bilmeden tanıdık JsonData arayüzü ile çalışır. Adaptör, tüm çeviri işlemini dahili olarak gerçekleştirir.
Adapter desenini, mevcut bir sınıfı kullanmak istediğinizde ancak arayüzü ihtiyacınız olanla eşleşmediğinde veya uyumsuz arayüzlere sahip sınıflarla birlikte çalışan yeniden kullanılabilir bir sınıf oluşturmak istediğinizde kullanın.
Görev
KolayHadi bir medya oynatıcı adaptör sistemi kuralım! Tüm medya kaynaklarının standart bir arayüz üzerinden ses sağlamasını bekleyen modern bir ses sisteminiz olduğunu, ancak tamamen farklı bir ses üretme yöntemine sahip eski usul bir plak çaları (vinyl player) sisteme entegre etmeniz gerektiğini hayal edin.
Adaptör deseni uygulamanızı organize etmek için iki dosya oluşturacaksınız:
media_adapter.dart: Bu dosya arayüzünüzü ve adaptör sınıflarınızı içerir. Modern sisteminizin beklediğiAudioSourceadında soyut bir sınıf tanımlayın; bu sınıf, ses çıktısını bir dize (string) olarak döndürenString playAudio()yöntemine sahip olmalıdır. Ardından, eski ekipmanı temsil eden birVinylPlayersınıfı oluşturun; bu sınıfın birtrackNamealanı ve*crackle* Playing vinyl: [trackName] *crackle*döndüren birString spinRecord()yöntemi olmalıdır. Son olarak,AudioSourcearayüzünü uygulayan ve birVinylPlayernesnesini sarmalayan birVinylAdapteroluşturun. AdaptörünplayAudio()yöntemi, plak çalarınspinRecord()yöntemini çağırmalı ve sonucu döndürmelidir; böylece uyumsuz arayüzler arasında köprü kurulmuş olur.main.dart: Medya adaptör dosyanızı içe aktarın ve adaptörün, modernAudioSourcearayüzünü bekleyen kodla eski plak çaların nasıl çalışmasını sağladığını gösterin.trackNamedeğeriBohemian Rhapsodyolan birVinylPlayeroluşturun. Ardından bu plak çaları sarmalayan birVinylAdapteroluşturun. Beklenen arayüze uygun olduğunu kanıtlamak için adaptörüAudioSourcetipinde bir değişkende saklayın. Ses kaynağınız üzerindeplayAudio()yöntemini çağırın ve sonucu yazdırın.
Bu desenin güzelliği, ana kodunuzun standart AudioSource arayüzü ile çalışmasıdır; arka planda eski bir plak çaların asıl işi yaptığını bilmesine gerek kalmaz!
Beklenen çıktı:
*crackle* Playing vinyl: Bohemian Rhapsody *crackle*Kopya kağıdı
Adapter (Adaptör) deseni, aksi takdirde iş birliği yapamayacak iki sınıf arasında bir köprü görevi görerek uyumsuz arayüzlerin birlikte çalışmasını sağlar.
Adaptör, mevcut bir sınıfı istemcilerin beklediği yeni bir arayüzle sarmalar; bu da onu üçüncü taraf kütüphaneleri veya eski (legacy) kodları entegre ederken kullanışlı hale getirir.
Temel Yapı
// İstemcilerin beklediği hedef arayüz
abstract class JsonData {
String getJson();
}
// Uyumsuz arayüze sahip mevcut sınıf
class XmlService {
String getXml() {
return '<data><name>John</name></data>';
}
}
// Adaptör, XmlService'i JsonData ile uyumlu hale getirir
class XmlToJsonAdapter implements JsonData {
final XmlService _xmlService;
XmlToJsonAdapter(this._xmlService);
@override
String getJson() {
String xml = _xmlService.getXml();
// XML'i JSON'a dönüştür
return '{"name": "John"}';
}
}Kullanım
void main() {
var xmlService = XmlService();
var adapter = XmlToJsonAdapter(xmlService);
print(adapter.getJson()); // {"name": "John"}
}Adaptör, uyumsuz sınıfı sarmalarken hedef arayüzü uygular. İstemci kodu, altta yatan uygulamayı bilmeden tanıdık arayüzle çalışır.
Ne zaman kullanılır: Mevcut bir sınıfı kullanmanız gerektiğinde ancak arayüzü ihtiyacınız olanla eşleşmediğinde veya uyumsuz arayüzlere sahip sınıflarla iş birliği yapan yeniden kullanılabilir bir sınıf oluştururken.
Kendin dene
import 'media_adapter.dart';
void main() {
// TODO: Parça adı "Bohemian Rhapsody" olan bir VinylPlayer oluşturun
// TODO: Vinyl player'ı sarmalayan bir VinylAdapter oluşturun
// TODO: Adaptörü AudioSource tipinde bir değişkende saklayın
// TODO: Ses kaynağınız üzerinde playAudio() metodunu çağırın ve sonucu yazdırın
}
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 DosyalarKütüphaneler ve ImportlarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar KelimesiMetotlarÖrnek DeğişkenleriConstructor TemelleriÖzet - Basit Hesap Makinesi4Null Safety
Null Safety'ye GirişNullable ve Non-Nullable? ve ! OperatörleriLate Anahtar Kelimesi ve Null SafetyNull-Aware OperatörleriSınıflarda Null SafetyÖzet - Kullanıcı Profili Sistemi7Soyut Sınıflar ve Arayüzler
Soyut SınıflarSoyut MetotlarDart'ta ArayüzlerÖrtük ArayüzlerUygulama vs. GenişletmeÇoklu ArayüzlerÖzet - Şekil Hesaplayıcı10Koleksiyonlar ve Generic'ler
List, Set, Map Genel BakışTip Güvenli KoleksiyonlarGeneric SınıflarGeneric MetotlarGeneric KısıtlamalarIterable ve IteratorÖzet - Generic Depolama2Dart'ta Yapıcılar
Varsayılan Yapıcıİsimlendirilmiş Yapıcılarİlklendirme ListeleriSabit YapıcılarFabrika YapıcılarıYönlendiren YapıcılarÖzet - Şekil Oluşturucu5Kapsülleme
Public ve Private Üyeler_ Öneki KuralıKütüphane Düzeyinde GizlilikGetter ve Setter DetaylarıBilgi GizlemeÖzet - Öğrenci Kayıtları8Mixin'ler
Mixin'lere GirişMixin OluşturmaBirden Fazla Mixin KullanımıMixin'lerde on Anahtar KelimesiMixin vs KalıtımMixin vs ArayüzÖzet - Hayvan Sistemi11Özel Metotlar
toString() OverridehashCode ve == OverrideComparable Arayüzücall() MetodunoSuchMethod OverrideÖzet - Özel Koleksiyon14Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıObserver KalıbıStrategy Kalıbı17Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakter SistemiAraç Kiralama Servisi3Sınıf Özellikleri
Instance ve Statik ÜyelerFinal ve Const AlanlarLate DeğişkenlerStatik Metotlar ve AlanlarGetters ve SettersÖzet - Banka Hesabı Yöneticisi6Kalıtım
Temel Kalıtımsuper Anahtar KelimesiMetot Ezme@override Anotasyonufinal Sınıf Anahtar KelimesiYapıcı Metotlar ve KalıtımÖzet - Çalışan Hiyerarşisi9Çok Biçimlilik
Çok Biçimlilik TemelleriInterface'ler ile Çok BiçimlilikÇalışma Zamanı Tip Kontrolüis ve as OperatörleriCovariant Anahtar KelimesiÖzet - Ödeme İşlemcisi12Asenkron OOP
Futures ve async/awaitStream TemelleriStream Controller'larAsenkron KurucularSınıf Metotlarında Asenkron KullanımıÖzet - Data Fetcher15Tasarı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ıRepository Kalıbı