Giriş
Uygulamanızda halihazırda var olan bir arayüzü veya kütüphaneyi değiştirmeden yeni bir arabirimle çalışmak istediğinizde Adapter Pattern devreye girer.
Bu desen, bir sınıfın arayüzünü, istemcinin beklediği başka bir arayüze dönüştürerek mevcut kodların yeniden kullanılmasını sağlar.
Yazıda:
-
Adapter Pattern nedir?
-
Kurulum ve temel örnek
-
Katmanlı mimaride entegrasyon
-
Gerçek dünya senaryosu – Legacy API uyarlama
-
Avantaj & Dezavantajlar

1. Adapter Pattern Temel Kavramları
-
Target Interface: İstemcinin kullanmak istediği arayüz.
-
Adaptee: Mevcut sınıf veya kütüphane, farklı bir arayüze sahip.
-
Adapter:
Target Interface’i uygular, içerdeAdaptee’yi çağırarak dönüşüm yapar. -
Client:
Target Interfaceüzerinden çağrı yapar, Adapter’ı bilmez.
2. Kurulum ve Basit Örnek
A. Target Interface Tanımı
public interface IAudioPlayer
{
void Play(string fileName);
}
B. Adaptee (Mevcut Sınıf)
public class LegacyMediaPlayer
{
public void PlayMp4(string fileName)
{
Console.WriteLine($"MP4 oynatılıyor: {fileName}");
}
}
C. Adapter Sınıfı
public class MediaAdapter : IAudioPlayer
{
private readonly LegacyMediaPlayer _legacyPlayer;
public MediaAdapter(LegacyMediaPlayer legacyPlayer)
{
_legacyPlayer = legacyPlayer;
}
public void Play(string fileName)
{
// Dosya uzantısına göre uygun metoda yönlendir
if (fileName.EndsWith(".mp4"))
_legacyPlayer.PlayMp4(fileName);
else
throw new NotSupportedException("Desteklenmeyen format");
}
}
D. Client Kullanımı
public class AudioPlayer : IAudioPlayer
{
private readonly IAudioPlayer _player;
public AudioPlayer(IAudioPlayer player)
{
_player = player;
}
public void Play(string fileName) => _player.Play(fileName);
}
// Kullanım
var adapter = new MediaAdapter(new LegacyMediaPlayer());
var player = new AudioPlayer(adapter);
player.Play("video.mp4"); // MP4 oynatılıyor: video.mp4

3. Katmanlı Mimari Entegrasyonu
| Katman | Sorumluluk |
|---|---|
| Domain/API | IAudioPlayer arayüzü |
| Infrastructure | LegacyMediaPlayer sınıfı ve MediaAdapter |
| Application | AudioPlayer veya servisler aracılığı ile kullanım |

4. Gerçek Dünya Senaryosu: Legacy API Uyarlama
Örneğin, eski bir Third-Party ödeme servisini yeni IPaymentService arayüzüyle kullanmak:
// Target Interface
public interface IPaymentService
{
bool ProcessPayment(decimal amount);
}
// Adaptee (Legacy API)
public class OldPaymentGateway
{
public string MakePayment(string amount)
{
// "OK" veya "FAIL" döner
return "OK";
}
}
// Adapter
public class PaymentAdapter : IPaymentService
{
private readonly OldPaymentGateway _gateway;
public PaymentAdapter(OldPaymentGateway gateway) => _gateway = gateway;
public bool ProcessPayment(decimal amount)
{
var result = _gateway.MakePayment(amount.ToString("F2"));
return result == "OK";
}
}
Bu sayede, yeni sistem IPaymentService ile çalışmaya devam ederken, eski gateway’e dokunmaya gerek kalmaz.
5. Avantajlar & Dezavantajlar
Avantajlar
-
Yeniden Kullanım: Mevcut sınıfları bozmadan yeniden kullanırsınız.
-
Loose Coupling: İstemci ile adaptee arası adapter katmanı sayesinde gevşek bağlılık.
-
Tek Sorumluluk: Adapter, sadece dönüştürme mantığını içerir.
Dezavantajlar
-
Ekstra Katman: Basit durumlarda gereksiz karmaşıklık.
-
Performans: Adapter katmanı ek bir çağrı hattı oluşturur.
-
Bakım: Çok sayıda adapter sınıfı yönetimi zorlaştırabilir.
İleri Okuma ve Kaynaklar
6. Sonuç
Adapter Pattern, farklı arayüzlere sahip kodları tek bir standart arayüz altında toplamanıza yardımcı olur. Legacy kodları, üçüncü parti kütüphaneleri veya farklı protokolleri modern mimarilere zarar vermeden uyarlamak için ideal bir çözümdür.