الگوی طراحی Adapter


مثال در دنیای واقعی

تبدیل شارژر تلفن همراه را در نظر بگیرید. یک شارژر با پایه سه شاخه که در جعبه تلفن همراه موجود است را نمی‌توانید به پریز دو شاخه منزل وصل کنید. نیاز به پایه تبدیل دارید تا این دو را با هم سازگار کند. این وسیله تبدیل یک adapter است.

به بیان ساده

به اشیاء با رابط های ناسازگار امکان همکاری می‌دهد.

این الگو، یک شئ غیر سازگار را در یک adapter برای سازگاری با سایر کلاس‌ها پنهان می‌کند. adapter این اجازه را می‌دهد که دو یا چند شئ ناسازگار با هم ارتباط یا تعامل برقرار کنند.

معمولاً با این هدف مورد استفاده قرار می گیرد که بدون تغییر در کد اصلی، بتوان استفاده از کلاس های فعلی را مقدور ساخت.

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

بازی شکارچی شیر را در نظر بگیرید. ابتدا یک interface از شیر داریم که با استفاده از آن انواع شیر ها(با نژاد های مختلف) را پیاده‌سازی می‌کنیم.

interface Lion
{
    public function roar();
}

class AfricanLion implements Lion
{
    public function roar()
    {
    }
}

class AsianLion implements Lion
{
    public function roar()
    {
    }
}

و شکارچی که البته برایش فرقی نمی‌کند کدام نژاد از شیر را شکار خواهد کرد. او برای شکار به دنبال صدای غرش شیر است.

class Hunter
{
    public function hunt(Lion $lion)
    {
        $lion->roar();
    }
}

حالا بیایید سگ‌های وحشی را هم اضافه کنیم تا شکارچی بتواند آن‌ها را هم شکار کند. اما یک مشکل داریم. سگ مانند شیر غرش نمی‌کند، پارس می‌کند و در فضای برنامه نویسی یعنی سگ interface متفاوتی دارد. اینجا برای سازگاری سگ و شیر از adapter استفاده می‌کنیم.

// This needs to be added to the game
class WildDog
{
    public function bark()
    {
    }
}

// Adapter around wild dog to make it compatible with our game
class WildDogAdapter implements Lion
{
    protected $dog;

    public function __construct(WildDog $dog)
    {
        $this->dog = $dog;
    }

    public function roar()
    {
        $this->dog->bark();
    }
}

بدین صورت ناسازگاری کلاس سگ‌های وحشی را(متد پارس سگ) درAdapter پنهان کردیم تا سایر مولفه های مرتبط بدون مشکل کار خود را انجام دهند.

$wildDog = new WildDog();
$wildDogAdapter = new WildDogAdapter($wildDog);
$hunter = new Hunter();
$hunter->hunt($wildDogAdapter);
قابلیت استفاده.

برای استفاده از کلاس‌هایی که دارای روابط ناسازگار هستند یا functionality مشترکی با هم ندارند.

مطالعه بیشتر

Copyright © 2020 developit.ir(ehsan rezaei). All rights reserved.