Adaptör Deseni
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ını sağlar. Aksi takdirde iş birliği yapamayacak iki sınıf arasında köprü görevi görür ve mevcut bir sınıfı, istemcilerin beklediği yeni bir arayüzle sarar. Bu, özellikle üçüncü taraf kitaplıkları veya eski kodu uygulamanıza entegre ederken kullanışlıdır.
JSON verileriyle çalışan bir sisteminiz olduğunu, ancak yalnızca XML çıktısı veren bir bileşeni entegre etmeniz gerektiğini düşünün. 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 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 sarar ve JsonData arayüzünü uygular. İstemci kodu, verilerin başlangıçta bir XML kaynağından geldiğini bilmeden tanıdık JsonData arayüzüyle çalışır. Adaptör, tüm çeviriyi kendi içinde gerçekleştirir.
Mevcut bir sınıfı kullanmak istediğinizde ancak arayüzü ihtiyaçlarınıza uymadığında veya uyumsuz arayüzlere sahip sınıflarla iş birliği yapan yeniden kullanılabilir bir sınıf oluşturmanız gerektiğinde Adapter desenini kullanın.
Görev
KolayBir medya oynatıcı adaptör sistemi oluşturalım! Tüm medya kaynaklarının sesi standart bir arayüz üzerinden sağlamasını bekleyen modern bir ses sisteminiz olduğunu, ancak ses üretme yöntemi tamamen farklı olan eski tarz bir plak çaları entegre etmeniz gerektiğini düşünün.
Adaptör kalıbı uygulamanızı düzenlemek 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ği soyut birAudioSourcesınıfı tanımlayın; bu sınıf, ses çıktısını bir dize 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 birtrackNamealanına veString spinRecord()değerini döndüren*crackle* Playing vinyl: [trackName] *crackle*yöntemine sahip olmalıdır. Son olarakVinylAdapteruygulayan ve birAudioSourcesaran birVinylPlayeroluşturun. AdaptörünplayAudio()yöntemi, plak çalarınspinRecord()yöntemini çağırmalı ve sonucu döndürmelidir; böylece uyumsuz arayüzler birbirine bağlanır.main.dart: Medya adaptörü dosyanızı içe aktarın ve adaptörün eski plak çaların modernAudioSourcearayüzünü bekleyen kodla çalışmasını nasıl sağladığını gösterin. Parça adıVinylPlayerolan birBohemian Rhapsodyoluşturun. Ardından bu plak çaları saran birVinylAdapteroluşturun. Beklenen arayüze uyduğunu kanıtlamak için adaptörüAudioSourcetüründeki bir değişkende saklayın. Ses kaynağınızdaplayAudio()çağrısı yapın ve sonucu yazdırın.
Bu kalıbın güzelliği, ana kodunuzun standart AudioSource arayüzüyle çalışmasıdır; perde arkasında işi aslında eski bir plak çaların yaptığını bilmesine gerek yoktur!
Beklenen çıktı:
*crackle* Playing vinyl: Bohemian Rhapsody *crackle*Kendin dene
import 'media_adapter.dart';
void main() {
// TODO: "Bohemian Rhapsody" parça adıyla bir VinylPlayer oluştur
// TODO: Vinil oynatıcıyı saran bir VinylAdapter oluştur
// TODO: Adaptörü AudioSource tipinde bir değişkende sakla
// TODO: Ses kaynağında playAudio() çağır ve sonucu yazdır
}
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
1Nesne Tabanlı Programlamanın Temelleri
Harici DosyalarKütüphaneler ve İçe AktarmalarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar SözcüğüMetotlarÖrnek DeğişkenleriYapıcıların TemelleriTekrar - Basit Hesap Makinesi4Null Güvenliği
Null Güvenliğine GirişNullable ve Non-Nullable? ve ! OperatörleriLate Anahtar Sözcüğü ve Null GüvenliğiNull-Aware OperatörlerSınıflarda Null GüvenliğiTekrar - Kullanıcı Profili Sistemi7Soyut Sınıflar ve Arayüzler
Soyut SınıflarSoyut MetotlarDart'ta ArayüzlerÖrtük ArayüzlerUygulamak ve GenişletmekBirden Çok ArayüzTekrar - Şekil Hesaplayıcı10Koleksiyonlar ve Generics
List, Set, Map Genel BakışTür Güvenli KoleksiyonlarGeneric SınıflarGeneric MetotlarGeneric KısıtlamalarIterable ve IteratorTekrar - Generic Depolama2Dart'ta Yapıcılar
Varsayılan YapıcıAdlandırılmış YapıcılarBaşlatıcı ListeleriSabit YapıcılarFabrika YapıcılarıYönlendiren YapıcılarÖzet - Şekil Oluşturucu5Kapsülleme
Public ve Private Üyeler_ Ön Ek KuralıKütüphane Düzeyinde GizlilikGetter ve Setter DerinliğiBilgi GizlemeTekrar - Öğrenci Kayıtları8Mixin'ler
Mixin'lere GirişMixin OluşturmaBirden Çok Mixin KullanımıMixin'lerde on Anahtar SözcüğüMixin ve Kalıtım KarşılaştırmasıMixin ve Arayüz KarşılaştırmasıÖzet - Hayvan Sistemi11Özel Metotlar
toString() Geçersiz KılmahashCode & == Geçersiz KılmaComparable Arayüzücall() MetodunoSuchMethod Geçersiz KılmaÖzet - Özel Koleksiyon14Tasarım Desenleri Bölüm 1
Tasarım Desenlerine GirişSingleton DeseniFactory DeseniObserver DeseniStrategy Deseni3Sınıf Özellikleri
Örnek ve Static ÜyelerFinal ve Const AlanlarLate DeğişkenlerStatic Metotlar ve AlanlarGetter ve Setter'larÖzet - Banka Hesabı Yöneticisi6Kalıtım
Temel Kalıtımsuper Anahtar SözcüğüMetot Geçersiz Kılma@override Açıklamasıfinal Sınıf Anahtar SözcüğüKurucular ve KalıtımÖzet - Çalışan Hiyerarşisi9Çok Biçimlilik
Çok Biçimlilik TemelleriArayüzler Yoluyla Çok BiçimlilikÇalışma Zamanı Tür Denetimiis ve as OperatörleriCovariant Anahtar KelimesiTekrar - Ödeme İşlemcisi12Asenkron OOP
Future'ler ve async/awaitStream TemelleriStream DenetleyicileriAsenkron YapıcılarSınıf Metotlarında AsenkronlukÖzet - Veri Getirici15Tasarım Desenleri Bölüm 2
Komut DeseniAdaptör DeseniDekoratör DeseniŞablon Metot DeseniDurum DeseniBileşik DesenDepo DeseniKendi başına pratik yap: Online Dart derleyicisi