Adapter Design Pattern

Adapter tasarım kalıbı bir sistem parçasını var olan sisteme adapte edilmesini ve o sistem içerisinde kullanılabilmesini sağlayan bir kalıptır. Aşağıda bununla ilgili yaptığımız örnekte IError interfacesinden türeyen DbError ve ServiceError classlarından oluşan bir class grubu ve bu sisteme dahil olması geren Fax classı ve bunu gerçekleştiren FaxAdapter classı söz konusudur.

 

adapter design pattern ile ilgili görsel sonucu

 

IError adında bir interfacesimiz var ve bu interface kendinden türeyen classlar için bir grup oluşturacak.

  interface IError
  {
   int ErrorNumber { get; set; }
   string Description { get; set; }
   void SendMail();
  }

Aşağıda DbError adında bir classımız var ve bu class IErrordan türemiş vaziyette olup interfacesi implemente etmektedir.

 public class DbError : IError
 {
    private int _errorNumber;
    private string _description;

    public int ErrorNumber
    {
      get { return _errorNumber; }
      set { _errorNumber = value; }
    }

    public string Description 
    {
      get { return _description; }
      set { _description = value; }
    }


    public void SendMail()
    {
     Console.WriteLine("{0} {1} -> Db Hatasi gönderildi", ErrorNumber.ToString(), Description);
    }
 }

Aşağıda ServiceError adında bir classımız var ve bu class IErrordan türemiş vaziyette olup interfacesi implemente etmektedir.

 public class ServiceError : IError
 {
    private int _errorNumber;
    private string _description;

    public int ErrorNumber
   {
     get { return _errorNumber; }
     set { _errorNumber = value; }
   }

   public string Description
   {
     get { return _description; }
     set { _description = value; }
   }

   public void SendMail()
   {
     Console.WriteLine("{0} {1} -> servis Hatasi gönderildi", ErrorNumber.ToString(), Description);
   }
}

Bu iki class aynı interfaceden türeyip , bir grup oluşturmuş vaziyette. Yani herhangi bir fonksiyonda ortak interface üzerinden değerlendirilebilirler. Aşağıda ise fax adında bir classımız bulunmakta ve bu class diğer class grubundan farklı bir yapıdadır. Diğer iki class Error classıdır bu class ise fax işleminden sorumludur. Ancak fax işleminin içerisinde oluşabilecek Errorlar için ErrorCode ve ErrorDescription gibi propertyleri de içermektedir. Yapı olarak aynı interfaceden türemedikleri için , aynı fonksiyonda interface üzerinden birlikte ele alınamazlar.

 public class Fax
 {
    public int FaxErrorCode { get; set; }
    public string ErrorDescription { get; set; }

   //Fax yolla
    void Send()
    {
 
    }

    //Fax al
     void Get()
     {

     }
  
 }

Ancak aynı anda ele alınmak istenildikleri durumlar olabilir. Örneğin , yapıya dahil tüm errorlar bir kerede değerlendirilmek isteniyorsa ve buna fax ile ilgili errorlarda dahilse bu grup dışındaki classında diğer error grubuna dahil olması yani adapte olması gerekir. Adapter design patternida tam da burada devreye girer.

Yapmamız gereken şey FaxAdapter isminde bir adapter classı tanımlamak ve bunu IErrordan türetmek. Böylece FaxAdapter sınıfımız diğer error grubuna dahil olabilecek. Faxadapter sınıfımıza orjinal fax sınıfımızdan bir nesne üreterek , IErrordan kalıttığımız metotlar içerisinde ilgili fax classı metotlarını çağırırız. Aşağıda da görüldüğü gibi IErrordan gelen ErrorNumber orjinal fax classındaki FaxErrorCode’a, yine IError sınıfından gelen Description propertysi de orjinal fax classındaki ErrorDescription’a aracılık etmektedir. Yani aslında FaxAdapter classı  Fax classı IError sınıfından türeyen gruba adapte olabilsin diye aracılık eder.

 public class FaxAdapter : IError
 {
     private Fax _fax;

     public FaxAdapter(Fax fax)
     {
       _fax = fax;
     }

      public int ErrorNumber 
     {
       get { return _fax.FaxErrorCode; }
       set { _fax.FaxErrorCode = value; }
      }
   
     public string Description 
     {
       get { return _fax.ErrorDescription; }
       set { _fax.ErrorDescription = value; }
     }
     
     public void SendMail()
     {
        Console.WriteLine("{0} {1} Fax hatasi alindi ", ErrorNumber.ToString(), Description);
     } 
 }

Sistemin client tarafından çağırımı da aşağıdaki şekilde olacaktır.

  class Program
 {
    static void Main(string[] args)
   {
           Fax fax = new Fax { FaxErrorCode = 4000, ErrorDescription = "Cevap gelmiyor" };


           IError[] errors = {
                      new DbError{ErrorNumber=100,Description="Baglanti saglanamadi" },
                         new DbError{ErrorNumber=101,Description="sorgulama saglanamadi" },
                            new ServiceError{ErrorNumber=300,Description="yetki saglanamadi" },
                               new FaxAdapter(fax)
                            };

               foreach (IError error in errors)
                     error.SendMail();

                       Console.ReadKey();
       }
   }