Yazılım

Adapter Tasarım Deseni ve Uygulama Örneği

Kodnova 06 June 2026 10 görüntülenme
Adapter Tasarım Deseni ve Uygulama Örneği

Adapter tasarım deseni, yapısal tasarım kalıpları arasında yer alan ve arayüz uyumsuzluğu nedeniyle birlikte çalışamayan sınıfların birlikte çalışabilmesini sağlayan bir yazılım tasarım desenidir.

Bu desenin temel amacı, mevcut bir sınıfın arayüzünü değiştirmeden, istemcinin beklediği farklı bir arayüze uyumlu hale getirmektir. Özellikle eski sistemlerin yeni sistemlere entegre edilmesi, üçüncü parti servislerin projeye dahil edilmesi veya farklı kütüphanelerin ortak bir yapı altında kullanılması gereken durumlarda oldukça kullanışlıdır.

PROBLEM

Büyük ve zaman içinde gelişmiş yazılım sistemlerinde, yeni eklenen modüller veya harici servisler mevcut kod tabanıyla doğrudan uyumlu olmayabilir. Örneğin, uygulama ödeme işlemleri için standart bir metot beklerken, entegre edilmek istenen PayPal veya Stripe gibi servisler farklı metot isimleri ve farklı arayüzler sunabilir.

Bu durumda istemci kodunun her ödeme sağlayıcısının detaylarını bilmesi gerekir. Bu da kodun bağımlılığını artırır, bakımını zorlaştırır ve yeni bir ödeme sağlayıcısı eklendiğinde mevcut kod üzerinde daha fazla değişiklik yapılmasına neden olur.

ÇÖZÜM

Adapter tasarım deseni, bu problemi bir adapter sınıfı aracılığıyla çözer. Adapter sınıfı, istemcinin beklediği ortak arayüzü uygular ve arka tarafta adapte edilmesi gereken sınıfı kullanır.

Bu yapı sayesinde istemci kodu yalnızca ortak arayüzü bilir. PayPal, Stripe veya farklı bir ödeme sistemi kullanılacaksa, ilgili ödeme sağlayıcısına özel adapter sınıfı devreye girer. Böylece sistemler arasındaki arayüz uyumsuzluğu adapter katmanı tarafından gizlenmiş olur.

PAYPAL VE STRIPE İLE ADAPTER TASARIM DESENİ KULLANIMI

Bu örnekte, PayPal ve Stripe gibi iki farklı ödeme sistemini aynı uygulama içerisinde ortak bir yapı üzerinden kullanacağız. Bunun için öncelikle IPaymentGateway adında genel bir arayüz tanımlayacağız.

Bu arayüz, farklı ödeme sağlayıcılarının uygulama içerisinde aynı sözleşme ile kullanılmasını sağlar. Böylece uygulama, hangi ödeme sağlayıcısının kullanıldığını bilmeden yalnızca ProcessPayment metodunu çağırarak ödeme işlemini gerçekleştirebilir.


/// <summary>
/// Provides an interface for payment gateway implementations.
/// This interface defines a standard contract for processing payments
/// through different payment service providers.
/// </summary>
public interface IPaymentGateway
{
    /// <summary>
    /// Processes a payment with the specified amount.
    /// </summary>
    /// <param name="amount">The amount of money to process as payment.</param>
    /// <returns>Returns true if the payment is processed successfully.</returns>
    Task<bool> ProcessPayment(decimal amount);
}

Şimdi PayPal için bir ödeme sınıfı oluşturalım. Bu sınıf, PayPal üzerinden ödeme işlemini temsil eder. Buradaki MakePayment metodu, ödeme miktarını alır ve ödeme sürecini simüle eder.


/// <summary>
/// Represents a class for handling payments through PayPal.
/// This class provides functionality to make payments using PayPal's services.
/// </summary>
public class PayPalPayment
{
    /// <summary>
    /// Initiates a payment of the specified amount via PayPal.
    /// This method logs the payment amount to the console and simulates a payment process.
    /// </summary>
    /// <param name="amount">The monetary amount to be processed as payment.</param>
    public async Task<bool> MakePayment(decimal amount)
    {
        Console.WriteLine($"PayPal: Processing ${amount}");

        // Simulate payment processing delay
        await Task.Delay(1000);

        return true;
    }
}

Benzer şekilde Stripe için de bir ödeme sınıfı tanımlıyoruz. Ancak Stripe sınıfında ödeme işlemi SubmitPayment metodu üzerinden gerçekleştiriliyor. Yani PayPal ve Stripe sınıfları benzer işi yapsa da farklı metot isimlerine ve farklı arayüzlere sahipler.


/// <summary>
/// Represents a class for handling payments through Stripe.
/// This class encapsulates the functionality necessary to submit payments
/// using Stripe's payment processing services.
/// </summary>
public class StripePayment
{
    /// <summary>
    /// Submits a payment of the specified amount via Stripe.
    /// This method logs the payment amount to the console and simulates the payment processing
    /// to mimic a real transaction.
    /// </summary>
    /// <param name="amount">The monetary amount to be processed as payment.</param>
    public async Task<bool> SubmitPayment(decimal amount)
    {
        Console.WriteLine($"Stripe: Processing ${amount}");

        // Simulate payment processing delay
        await Task.Delay(1000);

        return true;
    }
}

PAYPAL ADAPTER SINIFI

PayPal sınıfını doğrudan IPaymentGateway arayüzü ile kullanamayız. Çünkü PayPal sınıfında beklenen ProcessPayment metodu yoktur. Bunun yerine PayPal sınıfında MakePayment metodu bulunur.

Bu uyumsuzluğu çözmek için PayPalAdapter sınıfını oluşturuyoruz. Bu sınıf IPaymentGateway arayüzünü uygular ve arka tarafta PayPalPayment sınıfının MakePayment metodunu çağırır.


/// <summary>
/// An adapter class that enables the use of PayPal payment services
/// through the common IPaymentGateway interface.
/// This allows the PayPalPayment class to be used in the application
/// where IPaymentGateway is expected.
/// </summary>
public class PayPalAdapter : IPaymentGateway
{
    private readonly PayPalPayment _payPal;

    /// <summary>
    /// Initializes a new instance of the PayPalAdapter class.
    /// </summary>
    /// <param name="payPal">The PayPal payment instance to be used by this adapter.</param>
    public PayPalAdapter(PayPalPayment payPal)
    {
        _payPal = payPal;
    }

    /// <summary>
    /// Processes the payment using the underlying PayPalPayment instance.
    /// </summary>
    /// <param name="amount">The amount of money to process as payment.</param>
    public async Task<bool> ProcessPayment(decimal amount)
    {
        return await _payPal.MakePayment(amount);
    }
}

STRIPE ADAPTER SINIFI

Stripe sınıfı da aynı şekilde doğrudan IPaymentGateway arayüzüne uyumlu değildir. Çünkü Stripe tarafında ödeme işlemi SubmitPayment metodu ile yapılır.

Bu nedenle StripeAdapter sınıfını oluşturuyoruz. Bu sınıf da IPaymentGateway arayüzünü uygular ve ProcessPayment çağrısını Stripe sınıfının anlayacağı SubmitPayment metoduna yönlendirir.


/// <summary>
/// An adapter class that allows the StripePayment class to be used
/// with the IPaymentGateway interface. This enables the integration of Stripe's
/// payment processing capabilities within systems that expect an IPaymentGateway.
/// </summary>
public class StripeAdapter : IPaymentGateway
{
    private readonly StripePayment _stripe;

    /// <summary>
    /// Initializes a new instance of the StripeAdapter class
    /// with a specific StripePayment instance.
    /// </summary>
    /// <param name="stripe">The StripePayment object that handles the actual payment processing.</param>
    public StripeAdapter(StripePayment stripe)
    {
        _stripe = stripe;
    }

    /// <summary>
    /// Processes a payment through Stripe by calling the SubmitPayment method
    /// on the StripePayment instance.
    /// </summary>
    /// <param name="amount">The amount of money to process as payment.</param>
    public async Task<bool> ProcessPayment(decimal amount)
    {
        return await _stripe.SubmitPayment(amount);
    }
}

ADAPTER PATTERN NASIL ÇALIŞIR?

Uygulama tarafında artık doğrudan PayPal veya Stripe sınıflarına bağımlı olmamıza gerek kalmaz. Bunun yerine IPaymentGateway arayüzü üzerinden işlem yaparız.

Hangi ödeme sistemi kullanılacaksa, ilgili adapter sınıfı bu arayüz tipindeki değişkene atanır. Böylece istemci kodu değişmeden farklı ödeme sağlayıcıları ile çalışabilir.


#region Adapter Pattern Works

IPaymentGateway paymentGateway;

paymentGateway = new PayPalAdapter(new PayPalPayment());
Console.WriteLine(await paymentGateway.ProcessPayment(100));

paymentGateway = new StripeAdapter(new StripePayment());
Console.WriteLine(await paymentGateway.ProcessPayment(150));

#endregion

ADAPTER TASARIM DESENİNİN AVANTAJLARI

Esneklik ve Genişletilebilirlik

Sisteme yeni bir ödeme sistemi veya farklı bir harici servis eklendiğinde, mevcut kodu değiştirmek yerine yalnızca yeni bir adapter sınıfı oluşturmak yeterlidir. Örneğin ileride PayTR, Iyzico veya farklı bir ödeme sağlayıcısı eklenmek istenirse, ilgili sağlayıcı için yeni bir adapter yazılarak sistem genişletilebilir.

Mevcut Kodun Korunması

Adapter deseni, mevcut sınıfların kodunu değiştirmeden onları farklı arayüzlerle kullanılabilir hale getirir. Bu özellik özellikle eski sistemlerle entegrasyonlarda oldukça önemlidir.

Bağımlılıkların Azaltılması

İstemci kodu PayPal, Stripe veya başka bir sağlayıcının detaylarını bilmek zorunda kalmaz. Sadece ortak arayüz olan IPaymentGateway ile çalışır. Bu da kodun daha temiz, test edilebilir ve sürdürülebilir olmasını sağlar.

Bakım Kolaylığı

Ödeme sağlayıcılarından birinin metot yapısı değişirse, bu değişiklik yalnızca ilgili adapter sınıfında yönetilebilir. Uygulamanın geri kalanında büyük değişiklikler yapılmasına gerek kalmaz.

SONUÇ

Adapter tasarım deseni, yazılım geliştirme sürecinde sıkça karşılaşılan arayüz uyumsuzluğu problemlerini çözmek için kullanılan oldukça faydalı bir tasarım desenidir.

Bu örnekte PayPal ve Stripe gibi farklı ödeme sağlayıcılarını ortak bir IPaymentGateway arayüzü altında topladık. Her ödeme sistemi kendi içinde farklı metotlara sahip olsa da adapter sınıfları sayesinde uygulama tarafında tek ve standart bir yapı üzerinden kullanılabilir hale geldi.

Bu yaklaşım, projelerin daha esnek, genişletilebilir ve sürdürülebilir olmasına katkı sağlar. Özellikle üçüncü parti servis entegrasyonlarında, eski sistemlerle yeni sistemlerin birlikte çalışması gereken durumlarda Adapter tasarım deseni oldukça etkili bir çözümdür.

```

Benzer İçerikler

Factory Method Tasarım Deseni ve Uygulama Örneği
Yazılım

Factory Method Tasarım Deseni ve Uygulama Örneği

Factory Method Tasarım Deseni ve Uygulama Örneği

Kodnova 06 June 2026
Abstract Factory Tasarım Deseni ve Uygulama Örneği
Yazılım

Abstract Factory Tasarım Deseni ve Uygulama Örneği

Abstract Factory Tasarım Deseni ve Uygulama Örneği

Kodnova 06 June 2026
Chain Of Responsibility Tasarım Deseni ve Uygulama Örneği
Yazılım

Chain Of Responsibility Tasarım Deseni ve Uygulama Örneği

Chain Of Responsibility Tasarım Deseni ve Uygulama Örneği

Kodnova 06 June 2026
Hemen iletişime geç