C# Adapter Pattern Kullanımı - OOP Design Pattern

Mevcut bir sınıfı veya arayüz sınıfını, eldeki farklı bir arayüz sınıfına uygun hale getirerek tekrar kullanmak amacıyla uygulanır. Çoğu zaman işe yarayacağını düşündüğümüz mevcut bir sınıfı kendi sistemimizde tekrar kullanmak isteriz. Fakat mevcut sınıf, tam beklediğimiz gibi olmayabilir. Bu durumda araya bir tane adaptör yazarak, mevcut sınıfı kendi sistemimize uygun hale getirebiliriz. Böylece adapte edilen nesnede kod değişikliği olmadan benzer bir arayüzü destekler hale getiririz. Ayrıca adaptasyon işlemi sırasında, adapte edilen nesnenin desteklemediği özellikler de adaptör tarafından gerçekleştirilebilir.




Örnek bir kullanım düşünürsek: mesela bir COM obje kullandığınızı düşünün. Bu objenin alanlarını kendi programınızdaki bir entity'nin alanlarına çevirip sanki programınızdaki bir entity gibi kullanmak istiyorsunuz. Bu durumda bu tasarım desenini kullanarak bunu gerçekleştirebilirsiniz. Örneğin COM objemiz içerisindeki obje aşağıdaki EAElement objesi olsun:

    /// <summary>
    /// Bunu bir COM objeden gelen element olarak dusunun.
    /// Sizin ise kendi projenizde kullandığınız Element nesneniz var.
    /// Bu iki element türünü kendi projenizde kullanabilmeniz için
    /// Bir adapter ile EAElement türünü Element'e çevirip kullanmanız gerekmekte.
    /// </summary>
    class EAElement
    {
        public string EAName { get; set; }
        public int EAElementID { get; set; }

        public void EAUpdate()
        {
            Console.WriteLine("EAUpdate {0} ID'li element update edildi.", EAElementID);
        }

    }


Kendi programımızda ise IElement interface'inden türeyen Element entity'imiz olsun:

    interface IElement
    {
        string Name { get; set; }
        int ElementID { get; set; }

        void Update();
    }

    class Element: IElement
    {
        private string _name;
        private int _elementId;

        public string Name
        {
            get
            {
                return _name;
            }
            set
            {
                _name = value;
            }
        }

        public int ElementID
        {
            get
            {
                return _elementId;
            }
            set
            {
                _elementId = value;
            }
        }

        public void Update()
        {
            Console.WriteLine("Update {0} ID'li element update edildi.", ElementID);
        }

    }


Şimdi IElement tipinde bir Adapter yazarak EAElement tipindeki bir nesneyi IElement tipini çeviriyoruz:

    class ElementAdapter:IElement
    {
        private EAElement _eaElement;

        public ElementAdapter(EAElement eaElement)
        {
            _eaElement = eaElement;
        }

        public string Name
        {
            get
            {
                return _eaElement.EAName;
            }
            set
            {
                _eaElement.EAName = value;
            }
        }

        public int ElementID
        {
            get
            {
                return _eaElement.EAElementID;
            }
            set
            {
                _eaElement.EAElementID = value;
            }
        }

        public void Update()
        {
            _eaElement.EAUpdate();
        }

    }


Son olarak artık EAElement tipindeki nesnemizi IElement tipine çeviren Adapter'imizi kullanmaya geldi. Artık Adapter sınıfımız ile EAElement nesnemizi IElement'miş gibi kullanabileceğiz.

    class Program
    {
        static void Main(string[] args)
        {
            EAElement eaElement = new EAElement() { EAElementID = 123, EAName = "Test Element" };
           
            //EAElement nesnesini Adapter sınıfımız ile IElement tipine çeviriyoruz
            IElement element = new ElementAdapter(eaElement);
        }

    }

Kaynak: http://www.tasarimdesenleri.com

0 yorum :

Yorum Gönder