Adapter Design Pattern در #C

سه شنبه 3 آذر 1394

Adapter design pattern در بین اینترفیس های ناسازگار استفاده می شود.این الگوی طراحی اینترفیس ناسازگار را به اینترفیس سازگار تبدیل می کند.به عبارت دیگر Adapter design pattern اجازه ارتباط بین دو اینترفیس ناسازگار را میدهد.در اینجا الگوی طراحی نقش مترجم و یا مبدل را بازی می کند.

Adapter Design Pattern در #C

Adapter design pattern  در بین اینترفیس های ناسازگار استفاده می شود.این الگوی طراحی اینترفیس ناسازگار را به اینترفیس سازگار تبدیل می کند.به عبارت دیگر Adapter design pattern اجازه ارتباط بین دو اینترفیس ناسازگار را میدهد.در اینجا الگوی طراحی نقش مترجم و یا مبدل را بازی می کند.

الگوی Adapter مانند یک واسط عمل می کند و درخواست هایی که میرسد را به شکلی تغییر می دهد که برای سیستم دیگر و یا کلاس دیگر قابل فهم باشد.

این الگوی طراحی سه Component مهم دارد : Target،Adapter و Adaptee

: Targetمی تواند یک کلاس یا Interface باشد  Client از طریق آن درخواستهای خود را بیان می‌کند.

Adaptee: کلاسی است که کلاینت به آن نیاز دارد ولی اینترفیس این کلاس با اینترفیس کلاینت یعنی Target همخوانی ندارد.برای اینکه کلاینت بتواند از امکانات کلاس Adaptee استفاده کند نیاز دارد که از یک اینترفیس واسط که نقش مبدل را دارد استفاده کند.

:Adapter یک کلاس است که قابلیتها و امکانات کلاس Adaptee را توسط  Interface مورد انتظار Client یعنی Target در اختیار آن قرار می دهد، تا Client بتواند از امکانات کلاس Adaptee استفاده کند. Adapter کلاسی هست که برای اتصال دو کلاس ناسازگار به کار می رود.

این الگوی طراحی بیشتر به عنوان یک پوشاننده به کار می رود.به این معنی که ضعف های اینترفیس های موجود را می پوشاند و اینترفیس جدید را تبدیل به اینترفیس مورد انتظار سیستم می کند.وقتی دو کلاس اینترفیس های غیرمرتبط با یکدیگر داشته باشند این الگو یکی را به دیگری تبدیل می کند تا بتوانند با هم کار کنند .

دو روش در الگوی طراحی Adapter پیش رو داریم :

Object Adapter Pattern

Class Adapter Pattern

روش اول:در این روش ناسازگاری با ایجاد یک شی برطرف می شود.همان طور که می دانید در .NET ارث بری چندگانه نداریم و اگر کلاسی قصد داشته باشد از چندین کلاس Adaptee استفاده کند از این روش استفاده می کنیم .در این روش کلاس Adapter به جای ارث بری از کلاس Adaptee یک Object از کلاس Adaptee را در خود ایجاد می کند .بنابراین شما می توانید به چندین کلاس Adaptee توسط کلاس Adapter دسترسی داشته باشید.

روش دوم :در این روش ناسازگاری با وراثت بین کلاس ها برطرف می شود.به بیان دیگر کلاس Adapter از ارث بری چندگانه استفاده میکند و اینترفیس های کلاس های Target و Adaptee را با هم سازگار می کند.

مثالی از دنیای واقعی:تصویر زیر نشان می دهد که چگونه استفاده های متفاوتی از مانیتور به عمل آمده است .

برای شرح الگوی طراحی Adapter با کمک دیاگرام های (UML آموزش زبان مدلسازی)UML  از یک مثال واقعی استفاده می کنیم .همان طور که می بینید در شکل زیر یک اینترفیسی داریم که لیست گوشی های لومیا را در فرمت Json بر می گرداند.ولی کاربر انتظار دارد که این لیست را در قالب XML دریافت کند .می توانیم این مشکل را با الگوی طراحی Adapter رفع کنیم

در کدهای زیر پیاده سازی دیاگرام بالا را می بینید

LumiaJSONAdaptee.CS

   

    public class LumiaJSONAdaptee  
    {  
        public string GetLumiaMobilesJSONSpecifications()  
        {  
            List < LumiaMobile > LumiaMobiles = new List < LumiaMobile > ();  
            LumiaMobiles.Add(new LumiaMobile  
            {  
                ModelId = "lumia550",  
                    Height = "136.1 mm",  
                    Width = "67.8 mm",  
                    Thickness = "9.9 mm",  
                    Weight = "141.9 g"  
            });  
            LumiaMobiles.Add(new LumiaMobile  
            {  
                ModelId = "lumia950",  
                    Height = "145 mm",  
                    Width = "73.2 mm",  
                    Thickness = "8.2 mm",  
                    Weight = "150 g"  
            });  
            LumiaMobiles.Add(new LumiaMobile  
            {  
                ModelId = "Text",  
                    Height = "",  
                    Width = "",  
                    Thickness = "8.2 mm",  
                    Weight = "150 g"  
            });  
            dynamic collectionLumiaMobiles = new  
            {  
                lumiaMobiles = LumiaMobiles  
            };  
            return JsonConvert.SerializeObject(collectionLumiaMobiles);  
        }  
    }  

LumiaMobile.cs

    public class LumiaMobile  
    {  
        public string ModelId  
        {  
            get;  
            set;  
        }  
        public string Height  
        {  
            get;  
            set;  
        }  
        public string Width  
        {  
            get;  
            set;  
        }  
        public string Thickness  
        {  
            get;  
            set;  
        }  
        public string Weight  
        {  
            get;  
            set;  
        }  
    }  

ILumiaXMLTarget.cs

    interface ILumiaXMLTarget  
    {   
       XmlDocument GetLumiaMobilesXMLSpecifications();  
    }  

LumiaXMLAdapter.cs

    

class MyLumiaClient  
{  
    private ILumiaXMLTarget _lumiaXmlTarget;  
    public MyLumiaClient(ILumiaXMLTarget lumiaXmlTarget)  
    {  
        _lumiaXmlTarget = lumiaXmlTarget;  
    }  
    public XmlDocument GetLumiaData()  
    {  
        return _lumiaXmlTarget.GetLumiaMobilesXMLSpecifications();  
    }  
} 

MyLumiaClient.cs

class MyLumiaClient  
{  
    private ILumiaXMLTarget _lumiaXmlTarget;  
    public MyLumiaClient(ILumiaXMLTarget lumiaXmlTarget)  
    {  
        _lumiaXmlTarget = lumiaXmlTarget;  
    }  
    public XmlDocument GetLumiaData()  
    {  
        return _lumiaXmlTarget.GetLumiaMobilesXMLSpecifications();  
    }  
}  
آموزش سی شارپ                                                                                             
فایل های ضمیمه

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان
  • C#.net
  • 3k بازدید
  • 1 تشکر

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید