آموزش دیزاین پترن Adapter Design Pattern

  • خانه
  • آموزش دیزاین پترن Adapter Design Pattern
Image تحقیقات

آموزش دیزاین پترن Adapter Design Pattern

سلام دوستان

بریم سراغ دیزاین پترن Adapter  .

بهترین مثالی که میشه برای دیزاین پترن Adapter زد خود وسلیه ی آداپتور برقی است . کار آداپتور تغییر ولتاژ بین دو وسیله برقی است جوری که بتوانند با هم کار کنند و سازگار باشند . در واقع یه رابط یا پلی است بین این دو تا ارتباط این دو موجودیت را برقرار کند.

یا مثلا سوکت های برق 3 شاخه رو حتما دیدین . این سوکت ها ممکنه در انگلستان به خوبی کار کنند ولی وقتی به ایران آورده می شود دیگر قابل استفاده نیست زیرا اکثر پریزهای برق داخل منازل از نوع 2 شاخه هستند پس باید یه آداپتور تهیه کنید تا این 3 شاخه را به 2 شاخه تبدیل کند و بتوان از آن استفاده کنید .

چیزی که در ساخت آداپتور مهم است این است که شما لازم نیست رفتار شی اتون رو تغییر دهید .تنها چیزی که لازم است این است که آداپتوری ایجاد کنید که اون سوکت 3 شاخه را به 2 شاخه تبدیل کند.

دیزاین پترن آداپتور (Adapter Design Pattern) از نوع structural یا ساختاری است  زیر رابطه ی بین دو آبجکت را ایجاد می کند.

2 نوع آموزش دیزاین پترن آداپتور (Adapter Design Pattern) معرفی کردن :

  1. inheritance version که به عنوان class version هم شناخته می شود .
  2. composition version که به عنوان  object version هم شناخته می شود.

در این جلسه فقط مثالی از  composition version زده می شود زیرا این روش طرفدارای بیشتری پیدا کرده است .

مثال :

/**
 * interface for creating render classes
 */
interface RenderTemplateInterface 
{
    public function renderHeader();
    public function renderBody();
    public function renderFooter();
}
 
/**
 * Used for rendering HTML templates
 */
class RenderHTMLTemplate implements RenderTemplateInterface 
{
 
    public function renderHeader() 
    {
        return "";
    }
 
    public function renderBody() 
    {
        return "Hello World";
    }
 
    public function renderFooter() 
    {
        return "";
    }
 
}
 
/**
 * Separate interface just for rendering PDF's
 * Having a separate interface from RenderTemplateInterface could be a requirement from a third party
 */
interface PDFTemplateInterface 
{
    public function renderTop();
    public function renderMiddle();
    public function renderBottom();
}
 
/**
 * Used for rendering PDF templates
 */
class RenderPDFTemplate implements PDFTemplateInterface 
{
 
    public function renderTop() 
    {
        return "This is the top of the PDF";
    }
 
    public function renderMiddle() 
    {
        return "Hello World";
    }
 
    public function renderBottom() 
    {
        return "This is the bottom of the PDF";
    }
 
}
 
/**
 * The adapter - this will encapsulate an instance of the RenderPDFTemplate class
 * to work polymorphically with the RenderTemplateInterface interface
 */
class PDFTemplateAdapter implements RenderTemplateInterface
{
    private $pdfTemplate;
 
    public function __construct(PDFTemplateInterface $pdfTemplate)
    {
        $this->pdfTemplate = $pdfTemplate;
    }
 
    public function renderHeader() 
    {
        return $this->pdfTemplate->renderTop();
    }
 
    public function renderBody() 
    {
        return $this->pdfTemplate->renderMiddle();
    }
 
    public function renderFooter() 
    {
        return $this->pdfTemplate->renderBottom();
    }
}
 
$pdfTemplate = new RenderPDFTemplate();
 
// $pdfTemplateAdapter will implement RenderTemplateInterface, just like RenderHTMLTemplate does
$pdfTemplateAdapter = new PDFTemplateAdapter($pdfTemplate);
 
// This is the top of the PDF
echo $pdfTemplateAdapter->renderHeader();

در مثال بالا 2 کلاس اصلی به نام های RenderHTMLTemplate و RenderPDFTemplate موجود است که در هر کدام 3 متد وجود دارد  و به فرض بخش هایی از تمپلت مخصوص خودشون رو ایجاد می کنند .

یک کلاس به نام PDFTemplateAdapter درست کردیم تا 2 کلاس بالا رو بهم ربط بدیم مانند یک آداپتور .