Programlamada Tasarım Desenleri #5 — Adapter (Uyarlayıcı) Design Pattern (C# .NET ile Anlatım)

Yazılım geliştirme dünyasında, farklı sistemlerin veya bağımsız bileşenlerin birlikte sorunsuz bir şekilde çalışabilmesi çoğu zaman zordur. İşte bu noktada Adapter Design Pattern (Uyarlayıcı Tasarım Deseni), adeta bir “köprü” görevi görerek yazılımın esnekliğini ve sürdürülebilirliğini artırır. Özellikle .NET ve C# projelerinde, dış servisler, eski sistemler veya farklı arayüzlere sahip kütüphanelerle uyum sağlamada önemli bir rol oynar.

Bu yazımızda, Adapter Design Pattern nedir, ne zaman ve nasıl kullanılır gibi sorulara cevap verecek, C# dilinde gerçek hayat senaryosuyla örnekler sunacağız.

Software Developer with Adapter Pattern

📌 Adapter Design Pattern Nedir?

Adapter Design Pattern, yazılım dünyasında Structural (Yapısal) Tasarım Deseni sınıfına girer. Temel amacı, bir nesnenin arabirimini (interface), client’ın beklediği başka bir arabirime dönüştürmektir.

Yani, var olan sınıfları değiştirmeden, beklenen arayüzle çalışabilmesini sağlar. Bu desen, genellikle mevcut bir sınıfın arayüzü, sistemde kullanılan arayüzle uyumlu olmadığında devreye girer.

💡 Ne Zaman Kullanılır?

  • Elinizde eski bir bileşen veya kütüphane varsa ve bu, projenizin kullandığı arayüze uymuyorsa.
  • Dış kaynaklı servisler (API, SDK vs.) sistemle doğrudan uyuşmuyorsa.
  • Sistemin çalışma prensibini bozmadan yeni işlevsellik kazandırmak istiyorsanız.

👨‍🏫 Gerçek Hayattan Benzerlik

Adaptörler, günlük yaşantımızda da yer alır. Örneğin, İngiltere’den aldığınız bir priz adaptörü, Türkiye’de çalışmaz. Ancak bir adaptör yardımıyla onu kullanabilirsiniz. Yazılımda adapter pattern’in amacı da aynen budur: Farklı parçaların birlikte çalışmasını sağlamak.

🔧 Adapter Pattern UML Diyagramı

Aşağıdaki şema, Adapter Pattern’in bileşenlerini soyut bir şekilde gösterir:

Adapter Pattern UML

Kaynak: Refactoring.Guru

👨‍💻 C# (.NET) ile Adapter Pattern Uygulaması

Senaryo:

Bir ödeme sistemi geliştiriyorsunuz. Sistemde kendi IPaymentGateway arayüzünüz var. Ancak üçüncü parti bir ödeme altyapısı (örneğin LegacyPaymentProcessor) ile entegre olmanız gerekiyor. Arayüzler uyuşmuyor. Ne yaparsınız? Tabii ki bir adapter yazarsınız!

1. Adım — Hedef Arayüz (Target Interface)

public interface IPaymentGateway
{
    void ProcessPayment(string customerId, decimal amount);
}

2. Adım — Uyumsuz Sınıf (Adaptee/Legacy System)

public class LegacyPaymentProcessor
{
    public void MakePayment(string user, double money)
    {
        Console.WriteLine($"Legacy system: {user} has paid {money} units.");
    }
}

3. Adım — Adapter Sınıfı

public class PaymentAdapter : IPaymentGateway
{
    private readonly LegacyPaymentProcessor _legacyProcessor;

    public PaymentAdapter(LegacyPaymentProcessor legacyProcessor)
    {
        _legacyProcessor = legacyProcessor;
    }

    public void ProcessPayment(string customerId, decimal amount)
    {
        // Adapter işlevi burada gerçekleşiyor.
        _legacyProcessor.MakePayment(customerId, (double)amount);
    }
}

4. Adım — Kullanıcı (Client)

public class PaymentService
{
    private readonly IPaymentGateway _paymentGateway;

    public PaymentService(IPaymentGateway paymentGateway)
    {
        _paymentGateway = paymentGateway;
    }

    public void PayOrder(string customerId, decimal amount)
    {
        _paymentGateway.ProcessPayment(customerId, amount);
    }
}

5. Adım — Program.cs ile çalıştırma

class Program
{
    static void Main(string[] args)
    {
        // Legacy sistem örnekleniyor
        var legacy = new LegacyPaymentProcessor();

        // Adapter sayesinde uyum sağlanıyor
        IPaymentGateway gateway = new PaymentAdapter(legacy);

        // Yeni sistemde kullanılıyor
        var paymentService = new PaymentService(gateway);
        paymentService.PayOrder("12345", 99.99m);
    }
}

🧪 Çıktı:

Legacy system: 12345 has paid 99.99 units.

Bu yapı sayesinde, esnek bir sistem elde etmiş olduk. Legacy sınıfı değiştirmeden, yeni arayüzümüze uyarladık.

✅ Avantajları

  • Kod tekrarını azaltır.
  • Eski sistemlerin yeniden yazılmasına gerek kalmadan yeni sistemlerle entegre olmasını sağlar.
  • Kodun sürdürülebilirliğini ve genişletilebilirliğini artırır.
  • Açık/kapalı prensibini destekler (Open/Closed Principle – SOLID).

⚠️ Dezavantajları

  • Ara katman kodların sayısı artabilir, bu da karmaşıklığı artırabilir.
  • Kötü kullanımı, performans sorunlarına neden olabilir.
  • Her zaman en iyi çözüm olmayabilir, özellikle çok fazla adaptasyon gerekiyorsa.

🎯 SEO Uyumlu SSS (Sık Sorulan Sorular)

Adapter Design Pattern neden kullanılır?

Adapter pattern, mevcut sınıfların arayüzlerini değiştirmeden, başka bir arayüzle uyumlu hale getirmek için kullanılır. Genellikle entegrasyon senaryolarında tercih edilir.

Adapter Design Pattern hangi kategoridedir?

Structural Design Pattern (Yapısal Tasarım Deseni) kategorisindedir.

Adapter Pattern ile Bridge Pattern arasındaki fark nedir?

Adapter, mevcut koda uyum sağlamaya yönelikken; Bridge, sistemin yapısını bölerek esnekliği artırmayı hedefler. Bridge, geleceğe yönelik esneklik sağlarken; Adapter, geçmişe dönük uyum sağlar.

🏁 Sonuç

Adapter Design Pattern, karmaşık sistemlerin daha esnek, modüler ve sürdürülebilir hale getirilmesinde oldukça etkilidir. Özellikle .NET veya C# projelerinde eski sistemler ve modern çözümler arasında “köprü” işlevi görmek için biçilmiş kaftandır.

Unutmayın, tasarım desenleri sadece kod değil, aynı zamanda iyi yazılım mimarisi inşa etmenin temel taşlarıdır.

📥 İleri Okuma

🧠 Siz Ne Düşünüyorsunuz?

Adapter pattern’i projelerinizde ne sıklıkla kullanıyorsunuz? Gerçek senaryolarda karşılaştığınız zorlukları yorum kısmında paylaşmayı unutmayın!

Bridge Adapter Pattern Art
Legacy Modern Payment Adapter
Adapter Pattern Infographic
Development Team and Adapter Pattern

Bu makale, “Programlamada Tasarım Desenleri” serimizin 5. yazısıdır. Diğerlerini de takip etmeyi unutmayın!

🔔 Bizi sosyal medyada takip edin ve bültenimize katılın!

**#csharp #dotnet #tasarimdesenleri #designpatterns #adapterpattern #csharpdevelopment #adapterdesigndesignpattern**

👉 Yazıyı beğendiyseniz paylaşmayı unutmayın!

📝 Copyright © 2024 – Tüm hakları saklıdır.

You may also like...

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir