Adapter Pattern Nedir?

Can Yüksel

Erdoğancan Yüksel

2 dakika 46 saniye okuma süresi

Adapter Pattern, uyumsuz arayüzlere sahip iki sınıfın birlikte çalışmasını sağlamak amacıyla kullanılan yapısal (structural) tasarım desenlerinden birisidir. Bir sınıfın arayüzünü (interface) başka bir sınıfın beklediği arayüze dönüştürerek iki sınıf arasında bir köprü kurmaktadır.

adapter-pattern-nedir

Adapter pattern, yapısal (structural) tasarım desenlerinden birisidir. İki uyumusuz sınıfın birlikte çalışması amacıyla kullanılmaktadır. Bir sınıfın arayüzünü (interface) başka bir sınıfın beklediği arayüze dönüştürmektedir. Adapter pattern, eski sınıfların yeni bir sisteme entegre edilmesini kolaylaştırarak kodun esnekliğini ve yeniden kullanılabilirliğini arttırmaktadır.

Adapter pattern'ın kullanım amaçları şu şekilde sıralanabilir:

  • Eski bir sistemi yeni bir sistem ile entegre etmek için kullanılabilmektedir.
  • Üçüncü parti kütüphanelerini mevcut kod yapısına uyarlamak için kullanılabilmektedir.

Adapter pattern kullanımının avantajları ve dezavantajları şu şekilde sıralanabilir:

Avantajları:
  • Mevcut kodları değiştirmeden yeni sınıfları entegre ederek aralarındaki uyumsuluk sorunlarının giderilmesini sağlar.
  • İhtiyaç durumunda yeni adapter sınıfları eklenerek kodun esnekliği korunmaktadır. SOLID prensiplerinden Açık/Kapalı Prensibi'ne (Open/Closed Principle) uymaktadır.
  • Adaptasyon ayrı bir sınıfta tutulduğundan SOLID prensiplerindenTek Sorumluluk İlkesi'ne (Single Responsibility Principle) uymaktadır.
Dezavantajı:
  • Çok sayıda adapter sınıfı kullanmak kod karışıklığını arttırabilir.

C# ile Adapter Pattern Uygulaması

Adapter pattern iki farklı şekilde uygulanabilmektedir:

  • Nesne Adaptörü (Object Adapter): Composition kullanılarak uyarlanan sınıfın bir örneğini tutmaktadır. Sınıfı miras almak yerine bileşen olarak kullandığından dolayı birden fazla sınıfı adapte edebilmektedir. Farklı sınıflarda çalışabilmektedir.
  • Sınıf Adaptörü (Class Adapter): Miras (Inheritance) kullanılarak hem uyarlanan sınıfı hem de hedef arayüzü miras almaktadır. C# gibi tekli kalıtım destekleyen dillerde sadece bir sınıftan miras alınabildiği için esneklik sınırlı olmaktadır.

1.Nesne Adaptörü (Object Adapter)

Object Adapter uygulaması için kod örneği:

// Mevcut sistemde kullanılan ödeme arayüzü olarak varsayalım.
public interface IPayment
{
    void ProcessPayment(decimal amount);
}

// QR ile yeni bir ödeme servisi eklenmesi gerektiğini varsayalım
public class QRPaymentService
{
    public void MakePaymentWithQRCode(decimal amount)
    {
        Console.WriteLine($"{amount} was paid with QR code service.");
    }
}


// Adapter sınıfı
public class OnlinePaymentAdapter : IPayment
{
    private readonly QRPaymentService _qrPaymentService;

    // Yapıcı (Constructor) metot ile QRPaymentService örneği adaptöre aktarılır.
    public OnlinePaymentAdapter(QRPaymentService qrPaymentService)
    {
        _qrPaymentService = qrPaymentService;
    }
    public void ProcessPayment(decimal amount)
    {
        _qrPaymentService.MakePaymentWithQRCode(amount);
    }
}

public class ECommerceApp
{
    private readonly IPayment _paymetProcessor;
    public ECommerceApp(IPayment paymetProcessor)
    {
        _paymetProcessor = paymetProcessor;
    }

    public void CompleteOrder(decimal amount)
    {
        if(amount > 0)
        {
            _paymetProcessor.ProcessPayment(amount);
            Console.WriteLine($"Payment successful, order completed. Total payment amount is: {amount}");
        }
        else
        {
            Console.WriteLine($"Payment failed, order cancelled at {DateTime.UtcNow.ToLongTimeString()}");
        }
    }
}

// Kullanımı:
QRPaymentService qRPaymentService = new QRPaymentService();
IPayment onlinePaymentAdatper = new OnlinePaymentAdapter(qRPaymentService);

ECommerceApp app = new ECommerceApp(onlinePaymentAdatper);
// Çalışan ödeme yöntemi
app.CompleteOrder(100.50m);
// Hatalı ödeme yöntemi
app.CompleteOrder(0);


//# Output:
100,50 was paid with QR code service.
Payment successful, order completed. Total payment amount is: 100,50

Payment failed, order cancelled at 14:42:19

2.Sınıf Adaptörü (Class Adapter)

Class Adapter uygulaması için kod örneği:

// Mevcut sistemde kullanılan ödeme arayüzü olarak varsayalım.
public interface IPayment
{
    void ProcessPayment(decimal amount);
}

// QR ile yeni bir ödeme servisi eklenmesi gerektiğini varsayalım
public class QRPaymentService
{
    public void MakePaymentWithQRCode(decimal amount)
    {
        Console.WriteLine($"{amount} was paid with QR code service.");
    }
}

// Adapter sınıfı
public class OnlinePaymentAdapter : QRPaymentService, IPayment
{
    public void ProcessPayment(decimal amount)
    {
        // Burada base sınıfın (QRPaymentService) metodunu çağırıyoruz
        MakePaymentWithQRCode(amount);
    }
}

public class ECommerceApp
{
    private readonly IPayment _paymetProcessor;
    public ECommerceApp(IPayment paymetProcessor)
    {
        _paymetProcessor = paymetProcessor;
    }

    public void CompleteOrder(decimal amount)
    {
        if (amount > 0)
        {
            _paymetProcessor.ProcessPayment(amount);
            Console.WriteLine($"Payment successful, order completed. Total payment amount is: {amount}");
        }
        else
        {
            Console.WriteLine($"Payment failed, order cancelled at {DateTime.UtcNow.ToLongTimeString()}");
        }
    }
}

// Kullanımı
IPayment onlinePaymentAdatper = new OnlinePaymentAdapter();

ECommerceApp app = new ECommerceApp(onlinePaymentAdatper);
app.CompleteOrder(350.50m);
app.CompleteOrder(0);


//# Output:
// 350,50 was paid with QR code service.
// Payment successful, order completed. Total payment amount is: 350,50
// Payment failed, order cancelled at 15:04:50

Object Adapter ve Class Adapter kullanımının farkları Inheritance ve Composition yaklaşımlarına dayanmaktadır. Class Adapter daha basit yapı sunmaktadır fakat esnekliği sınırlıdır. Object Adapter'de ise daha esnek olup miras sınırlaması olmadığından birden fazla sınıfla çalışabilmektedir.

 Sonuç olarak Adapter Pattern yazılım dünyasında tercih edilen kullanışlı bir tasarım desenidir. Mevcut sistemlerin ve sınıfların yeni şartlara uyarlanması konusunda son derece faydalıdır. Özellikle entegrasyon senaryolarında Adapter Pattern sıklıkla kullanılmaktadır.

Benzer İçerikler