Makale Özeti

Bu makalemizde sizlerle Gang Of Four(GoF) Structural tasarım desenlerinden bir tanesi olan Adapter tasarım desenini incelemeye çalışacağız.

Makale

Adapter Tasarım Deseni Nedir ve Ne Zaman Kullanılır ?

Bu makalemizde sizlerle Gang Of Four(GoF) Structural tasarım desenlerinden bir tanesi olan Adapter tasarım desenini incelemeye çalışacağız. Adapter pattern adından da belli olduğu gibi var olan bir sistemi yeni sisteme adapte etme amacı güdülerek kullanılan bir patterndir. Yani bu pattern, hali hazırda yazılmış olup belli işlevleri gören kodların tekrar yazılmadan, yeni sisteme uyarlanıp entegre edilerek kullanılmasını sağlar. Örnek vermek gerekirse COM nesnelerinin C# projesine entegre edilmesi için bu pattern kullanılabilir.

Uml


 

Bu desen adapte edilecek sınıf, adapte edilecek sınıfın nesnesini yeni bir interface ile içinde sarmalayarak (ya da adaptör sınıfı adapte edilecek sınıftan da türeyebilir) kullanacak olan adaptörden oluşur.

Diyelim ki, önceden yazılmış iskontolu tutarı hesaplayan bir tane sınıfımız olsun. Bu sınıfımızı tutar hesaplama uygulamamıza entegre etmeye çalışalım.

Sisteme Adapte Edilecek Sınıf (Adaptee sınıfı)

    public class Adaptee
    {
        public double IskontaliTutariHesapla(double fiyat, double adet)
        {
            Console.WriteLine("\nLütfen iskonto miktarını giriniz.\n");            
            double iskonto = Convert.ToDouble(Console.ReadLine());
            return fiyat * adet * (1 - iskonto);
        }
    }

Adaptee sınıfı içinde (yeni sisteme adapte edilecek sınıf) kullanıcıdan alınan fiyat, miktar ve iskonto bilgileri ile toplam tutarın hesaplanması yapılmaktadır.

ITutarHesaplayici

 public interface ITutarHesaplayici
    {
        double Hesapla(double fiyat, double adet);
    }

Adaptör nesnemizin implement edeceği ITutarHeaplayici interface'i data tipi double olan ve 2 tane parametre alan bir fonksiyon imzası taşımaktadır.

Adaptör Sınıfı

    public class Adapter:ITutarHesaplayici
    {
        private Adaptee adaptee;

        public Adapter()
        {
            adaptee = new Adaptee();
        }          

        public double Hesapla(double fiyat, double adet)
        {
            return adaptee.IskontaliTutariHesapla(fiyat, adet);
        }
    }

Adaptör sınıfında private Adaptee tipinde değişken bulunmaktadır. Adapter sınıfının içinde ITutarHesaplayici interfacinin Hesapla fonksiyonunu implement ederken, bu fonksiyon içinde Adaptee tipindeki değişkenin IskontaliTutariHesapla fonksiyonunu çağırarak adapte edeceğimiz sınıfın örneğini kullanmış bulunmaktayız.

Client Sınıfı

    public class Client
    {
        public void OdenecekMeblayiHesapla(ITutarHesaplayici hesaplayici)
        {
            Console.WriteLine("\nLütfen fiyatı giriniz.\n");
            double fiyat = Convert.ToDouble(Console.ReadLine());
            Console.WriteLine("\nLütfen miktarı giriniz.\n");
            double miktar = Convert.ToDouble(Console.ReadLine());
            Console.WriteLine("\nTutar = " + hesaplayici.Hesapla(fiyat, miktar));
            Console.WriteLine();
        }
    }

Bu sınıfın içindeki OdenecekMeblayiHesapla fonksiyonu kullanıcıdan fiyat ve miktar bilgilerini aldıktan sonra ITutarHesaplayici interfacini implement etmiş sınıfların nesnelerini parametre olarak alarak hesaplama işlemini yapmaktadır.

Program.cs

    class Program
    {
        static void Main(string[] args)
        {
            Adapter adapter = new Adapter();
            string tercih = null;
            Client client = new Client();
            try
            {
                while (true)
                {
                    Console.WriteLine("Malzemenin tutarını hesaplamak için 1 e," +
                        "\niskontolu tutarını hesaplamak için 2 ye," +
                        "\nuygulamadan çıkmak için 3'e basınız.\n");
                    tercih = Console.ReadLine();
                    int secenek = Convert.ToInt32(tercih);
                    Console.WriteLine();

                    if (secenek == 1)
                    {
                        client.OdenecekMeblayiHesapla(new MalzemeTipineGoreToplamTutariniHesapla());
                    }
                    else if (secenek == 2)
                    {
                        client.OdenecekMeblayiHesapla(new Adapter());
                    }
                    else
                    {
                        return;
                    }
                }
            }
            catch
            {
                Console.WriteLine("Hata ile karşılaşıldı. Uygulama sonlanacaktır.");
                Thread.Sleep(1500);                
            }
        }
    }

Main fonksiyonu içinde kullanıcıdan hangi tür hesaplama işlemini yapacağı bilgisini aldıktan sonra, client nesnesi oluşturarak içine ilgili nesneleri parametre olarak geçiyoruz. Adapter ve MalzemeTipineGoreToplamTutariniHesapla nesnelerini tutar hesaplamak için kullanıyoruz. MalzemeTipineGoreToplamTutariniHesapla nesnesini kendimiz yazdığımız halde Adapter nesnesi sayesinde önceden yazılmış olan Adaptee nesnesini sisteme adapte ederek kullanıyoruz.

Ekran Görüntüsü

Bu makalemizde adapter patternin ne olduğunu, ne zaman kullanıldığını ve nasıl implement edileceğini anlatmaya çalıştık.

Bir sonraki makalemizde görüşmek üzere.

Sezgin ZEKA

sezginzeka@gmail.com

Yararlanılan Linkler:

http://www.dofactory.com/Patterns/Diagrams/adapter.gif

Örnek Kod:

AdapterPatternSample.rar