Menu
Coddy logo textTech

Adaptör Kalıbı

Coddy'nin C# Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 57 / 70.

Adapter deseni, uyumsuz arayüzlerin birlikte çalışmasını sağlayan yapısal bir desendir. Bir sınıfın arayüzünü, istemcilerin beklediği bir arayüze 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.

Bu desen, mevcut bir sınıfı kullanmak istediğinizde ancak sınıfın arayüzü kodunuzun ihtiyaç duyduğu şeyle eşleşmediğinde özellikle yararlıdır. Orijinal sınıfı değiştirmek yerine (ki bu sınıf üzerinde kontrolünüz olmayabilir), onu sarmalayan bir adaptör oluşturursunuz:

// Uyumsuz arayüze sahip mevcut sınıf
public class OldPrinter
{
    public void PrintMessage(string msg) => Console.WriteLine($"Old: {msg}");
}

// Kodunuzun beklediği arayüz
public interface IPrinter
{
    void Print(string text);
}

// Adaptör aradaki boşluğu doldurur
public class PrinterAdapter : IPrinter
{
    private OldPrinter _oldPrinter;
    
    public PrinterAdapter(OldPrinter oldPrinter)
    {
        _oldPrinter = oldPrinter;
    }
    
    public void Print(string text)
    {
        _oldPrinter.PrintMessage(text);  // Eski arayüze delege eder
    }
}

Artık kodunuz, beklenen arayüz aracılığıyla eski yazıcıyla çalışabilir:

OldPrinter legacy = new OldPrinter();
IPrinter printer = new PrinterAdapter(legacy);

printer.Print("Hello");  // Eski: Hello

Adapter deseni, üçüncü taraf kütüphaneleri veya eski kodları uygulamanıza entegre ederken paha biçilemezdir. İstemci kodu, arka planda eski ve uyumsuz bir sınıfın asıl işi yaptığından tamamen habersiz bir şekilde IPrinter arayüzü ile çalışır.

challenge icon

Görev

Kolay

Adapter desenini kullanarak bir medya oynatıcı sistemi oluşturalım. MP3 dosyalarını oynatan mevcut bir ses kütüphaneniz var, ancak uygulamanızın farklı medya türlerini işleyebilen birleşik bir arayüze ihtiyacı var. Modern medya oynatıcınızın eski ses kütüphanesiyle sorunsuz çalışmasını sağlamak için bu boşluğu dolduracak bir adaptör oluşturacaksınız.

Kodunuzu üç dosya halinde düzenleyeceksiniz:

  • LegacyAudio.cs: Bu, değiştiremeyeceğiniz mevcut bir kütüphaneyi temsil eder. MediaSystem ad alanında (namespace), "Playing MP3: {filename}" dizesini döndüren PlayMp3(string filename) metoduna sahip bir LegacyAudioPlayer sınıfı oluşturun. Bu sizin "adaptee"nizdir - yani uyumsuz arayüze sahip olan sınıf.
  • MediaAdapter.cs: Arayüzü ve adaptörü aynı ad alanında oluşturun. Bir dize döndüren Play(string filename) metoduna sahip bir IMediaPlayer arayüzü tanımlayın. Ardından IMediaPlayer arayüzünü uygulayan bir MediaPlayerAdapter sınıfı oluşturun. Adaptörünüz bir LegacyAudioPlayer örneğini sarmalamalı (yapıcı metot - constructor aracılığıyla iletilir) ve Play çağrısını eski oynatıcının PlayMp3 metoduna çevirmelidir.
  • Program.cs: Eski oynatıcıyı oluşturup adaptörünüzle sarmalayarak ve adaptörü IMediaPlayer arayüzü üzerinden kullanarak her şeyi bir araya getirin. Bu, istemci kodunun modern arayüzle nasıl çalışabildiğini, adaptörün ise arka planda eski sistemle iletişimi nasıl yönettiğini gösterir.

Bir girdi alacaksınız:

  • Oynatılacak dosya adı (örneğin, song.mp3)

Bir LegacyAudioPlayer oluşturun, bunu bir MediaPlayerAdapter içine sarmalayın, ardından IMediaPlayer arayüzünü kullanarak adaptör üzerinde Play metodunu çağırın ve sonucu yazdırın.

Örneğin, girdi favorite_track.mp3 ise, çıktı şu şekilde olmalıdır:

Playing MP3: favorite_track.mp3

Bu desenin güzelliği, ana kodunuzun yalnızca IMediaPlayer ile etkileşime girmesidir; asıl işi eski bir ses kütüphanesinin yaptığından haberi bile yoktur. Daha sonra farklı bir eski kütüphaneyi desteklemeniz gerekirse, istemci kodunu değiştirmeden sadece yeni bir adaptör oluşturmanız yeterli olacaktır!

Kopya kağıdı

Adapter deseni (Adapter pattern), iki sınıf arasında bir köprü görevi görerek uyumsuz arayüzlerin birlikte çalışmasını sağlayan yapısal bir desendir.

Bu desen, bir sınıfın arayüzünü istemcilerin beklediği bir arayüze dönüştürür; mevcut bir sınıfı kullanmak istediğinizde ancak arayüzü kodunuzun ihtiyaçlarıyla eşleşmediğinde kullanışlıdır.

Temel yapı:

// Uyumsuz arayüzü olan mevcut sınıf (Adaptee)
public class OldPrinter
{
    public void PrintMessage(string msg) => Console.WriteLine($"Old: {msg}");
}

// Kodunuzun beklediği hedef arayüz
public interface IPrinter
{
    void Print(string text);
}

// Adapter aradaki boşluğu doldurur
public class PrinterAdapter : IPrinter
{
    private OldPrinter _oldPrinter;
    
    public PrinterAdapter(OldPrinter oldPrinter)
    {
        _oldPrinter = oldPrinter;
    }
    
    public void Print(string text)
    {
        _oldPrinter.PrintMessage(text);  // Eski arayüze delege eder
    }
}

Kullanım:

OldPrinter legacy = new OldPrinter();
IPrinter printer = new PrinterAdapter(legacy);

printer.Print("Hello");  // Old: Hello

İstemci kodu, arka planda uyumsuz bir sınıfın asıl işi yaptığından habersiz bir şekilde hedef arayüzle çalışır. Bu desen, özellikle üçüncü taraf kütüphaneleri veya eski kodları entegre ederken değerlidir.

Kendin dene

using System;
using MediaSystem;

class Program
{
    public static void Main(string[] args)
    {
        // Dosya adı girişini oku
        string filename = Console.ReadLine();
        
        // TODO: Bir LegacyAudioPlayer örneği oluşturun
        
        // TODO: Bunu bir MediaPlayerAdapter içine sarın
        
        // TODO: Adaptörü IMediaPlayer arayüzü üzerinden kullanın
        // ve filename ile Play metodunu çağırmanın sonucunu 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