Menu
Coddy logo textTech

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.

challenge icon

Görev

Kolay

Hadi 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ği AudioSource adında soyut bir sınıf tanımlayın; bu sınıf, ses çıktısını bir dize (string) olarak döndüren String playAudio() yöntemine sahip olmalıdır. Ardından, eski ekipmanı temsil eden bir VinylPlayer sınıfı oluşturun; bu sınıfın bir trackName alanı ve *crackle* Playing vinyl: [trackName] *crackle* döndüren bir String spinRecord() yöntemi olmalıdır. Son olarak, AudioSource arayüzünü uygulayan ve bir VinylPlayer nesnesini sarmalayan bir VinylAdapter oluşturun. Adaptörün playAudio() yöntemi, plak çaların spinRecord() 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, modern AudioSource arayüzünü bekleyen kodla eski plak çaların nasıl çalışmasını sağladığını gösterin. trackName değeri Bohemian Rhapsody olan bir VinylPlayer oluşturun. Ardından bu plak çaları sarmalayan bir VinylAdapter oluşturun. Beklenen arayüze uygun olduğunu kanıtlamak için adaptörü AudioSource tipinde bir değişkende saklayın. Ses kaynağınız üzerinde playAudio() 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
  
}
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