Adapter

GOF Intent:
Convert the interface of the class into another interface clients expect. Adapter lets classes work together that couldn’t otherwise because of incompatible interfaces.

گاه لازم است که يک کلاس توسط Client فراخواني شود. اما interface آن کلاس با آنچه مورد انتظار Client است تفاوت دارد. اينجا است که Adapter بکار مي‌آيد.

نام ديگر اين Pattern، Wrapper است.

چه وقت از Adapter design pattern استفاده کنيم؟

  • وقتي که مي خواهيم از کلاسي استفاده کنيم، اما interface آن کلاس با آنچه مورد نياز است، منطبق نيست.
  • وقتي مي خواهيد يک کلاس reusable داشته باشيد که لازم است با کلاس هاي نامرتبط با interface هاي احتمالا مختلف کار کند. در اين حالت Adapter ، يک interface يکپارچه از آنها براي Client ارائه مي دهد.

Adapter Design Pattern

انواع Adapter:
َAdapter به دو شکل پياده مي شود

  • Object Adapter
  • Class Adapter

در هر دو حالت يک کلاس بعنوان Adapter وجود دارد که متد مورد انتظار Client را پياده مي‌کند. در حالت Object Adapter اين کلاس صرفا متدي از کلاس Adaptee را فراخواني مي کند. اما در حالت Class Adapter، کلاس Adapter لازم است Adaptee را extends نمايد. در نمودارهاي زير تفاوت اين دو نوع پياده سازي قابل مشاهده است:

Object Adapter


Class Adapter

مثال 1:
فرض کنيد کلاس هاي Adaptee و Target بدين صورت هستند:

public class Product{ // Target
   public int getRialPrice();
}


interface ForeignProduct{ // Adaptee
   public int getPrice(); // in Dollar
}

ايجاد Class Adapter:

public class ProductAdapter extends ForeignProduct implements Product{
   public int getRialPrice(){
      return getPrice() * 2000; // 2000 is dollar rate
   }
}

و همين کار به روش Object Adapter:

public class ProductAdapter extends Product{

   ForeignProduct aInstance;

   public int getRialPrice(){
      return aInstance.getPrice() * 2000; // 2000 is dollar rate
   }
}

فارغ از اينکه Adapter با چه روشي پياده شده باشد، بدين صورت توسط Client فراخواني مي گردد:

public static void main(String[] args)
{
   Product product1 = new ProductAdapter();
   int i = product1.getRialPrice();
}

مثال 2:

interface EmployeeInterface{
   public void showEmployeeInfo();
}


public class Employee implements EmployeeInterface{
   private name;

   public Employee(String name){
      this.name = name;
   }

   public void showEmployeeInfo(){
      System.out.println(“Employee Name:”+name);
   }
}


public class Consultant{
   private name;

   public Consultant(String name){
      this.name = name;
   }

   public string getName(){
   return name;
   }
}


// Object Adapter Style:
public EmployeeAdapter implements EmployeeInterface{
   private consultant aInstance;

   public EmployeeAdapter(String name){
      aInstance = new Consultant(name);
   }

   public void showEmployeeInfo(){
      System.out.println(“Nonsultant Name:”+aInstance.getName());
   }
}


// Class Adapter Style:
public EmployeeAdapter extends Consultant implements EmployeeInterface{

   public EmployeeAdapter(String name){
      super(name);
   }

   public void showEmployeeInfo(){
      System.out.println(“Nonsultant Name:”+getName());
   }
}


public static void main(String[] args){
   Arraylist list = new Arraylist();
   list.Add(new Employee(“Tom”));
   list.Add(new Employee(“Jerry”));
   list.Add(new EmployeeAdapter(“Max”));
   for (Iterator it = list.iterator(); it.hasNext();) {
      it.next().showEmployeeInfo();
   }
}

مقايسه Class Adapter و Object Adapter:

مزيت Object Adapter:

  • Object Adapter براي Subclass هاي Adaptee نيز اعمال مي شوند، اما در Class Adapter اينگونه نيست.
مزيت هاي Class Adapter:
  • در حالت Class Adapter امکان override کردن متدهاي Adaptee هم وجود دارد. اين کار در Object Adapter شدني نيست
  • در Class Adapter فقط يک object توليد مي شود و اشاره گر ديگري به Adaptee مورد نياز نيست.

منبع ها:

  1. Design Patterns – Elements of Reusable Object Oriented Software (GOF) By Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides
  2. Adapter in codeproject

با برچسب: ,
پست شده در Design Pattern

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

*


− یک = 4

شما می‌توانید از این دستورات HTML استفاده کنید: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

تماس با من: admin@paspars.com