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. İki sınıf arasında köprü görevi görerek bir sınıfın arayüzünü istemcilerin beklediği bir arayüze dönüştürür. Bunu, Avrupa tipi bir cihazı Amerikan tipi bir prize takmanızı sağlayan 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 kalıbı, üçüncü taraf kütüphaneleri veya eski kodu uygulamanıza entegre ederken paha biçilmezdir. İstemci kodu, perde arkasında işi gerçekte eski ve uyumsuz bir sınıfın yaptığından tamamen habersiz bir şekilde IPrinter arayüzüyle ç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 kitaplığınız var, ancak uygulamanızın farklı medya türlerini işleyebilen birleşik bir arayüze ihtiyacı var. Bu boşluğu kapatmak için bir adapter oluşturacak ve modern medya oynatıcınızın eski ses kitaplığıyla sorunsuz bir şekilde çalışmasını sağlayacaksınız.

Kodunuzu üç dosyaya ayıracaksınız:

  • LegacyAudio.cs: Bu, değiştiremeyeceğiniz mevcut bir kitaplığı temsil eder. LegacyAudioPlayer ad alanında, MediaSystem metoduna sahip ve PlayMp3(string filename) dizesini döndüren bir "Playing MP3: {filename}" sınıfı oluşturun. Bu, uyumsuz arayüze sahip sınıf olan "adaptee"dir.
  • MediaAdapter.cs: Arayüzü ve adapter'ı aynı ad alanında oluşturun. Dize döndüren IMediaPlayer metoduna sahip bir Play(string filename) arayüzü tanımlayın. Ardından MediaPlayerAdapter arayüzünü uygulayan bir IMediaPlayer sınıfı oluşturun. Adapter'ınız bir LegacyAudioPlayer örneğini (constructor aracılığıyla geçirilen) sarmalamalı ve Play çağrısını eski oynatıcının PlayMp3 metoduna çevirmelidir.
  • Program.cs: Eski oynatıcıyı oluşturarak, onu adapter'ınızla sararak ve adapter'ı IMediaPlayer arayüzü üzerinden kullanarak her şeyi bir araya getirin. Bu, adapter arka planda eski sistemle iletişimi yönetirken istemci kodunun modern arayüzle nasıl çalışabileceğini gösterir.

Bir girdi alacaksınız:

  • Oynatılacak dosyanın adı (ör. song.mp3)

Bir LegacyAudioPlayer oluşturun, onu bir MediaPlayerAdapter ile sarın, ardından Play arayüzünü kullanarak adapter üzerinde IMediaPlayer metodunu çağırın ve sonucu yazdırın.

Örneğin, girdi favorite_track.mp3 ise çıktı şöyle 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 kitaplığının yaptığından haberi yoktur. Daha sonra farklı bir eski kitaplığı desteklemeniz gerekirse, istemci kodunda hiçbir değişiklik yapmadan yeni bir adapter oluşturmanız yeterli olur!

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

Kendi başına pratik yap: Online C# derleyicisi