دیزاین پترن Adapter و bridge در php


هر دو این دیزاین پترن ها جزء "الگو های ساختاری" هستند.



دیزاین پترن Adapter


ابتدا به دیزاین پترن Adapter می پردازیم ،دیزاین پترن آداپتور زمانی به کار میرود که ما از یک API خارجی و یا از یک کلاسی استفاده میکنیم که مرتبا در حال تغییر است . فرض کنید ما یک bot برای تلگرام نوشته ایم و در آن از API تلگرام استفاده میکنیم. در API تلگرام برای ارسال پیام از متود sendMessage استفاده میکنیم ، پس مشخصا ما در ربات خود چندین بار از این متود برای ارسال پیام به کاربران استفاده میکنیم ، حالا فرض کنیم تلگرام در API خود تغییر ایجاد کند و از متود sendMsg بجای sendMessage استفاده کنیم ، در این صورت ما باید زمان زیادی را بسته به تعداد دفعات استفاده از این متود صرف تغیییر کد کنیم و خود این تغییر هم به تنهایی کافی نیست و زمانی هم برای تست نیاز داریم .

حال با استفاده از دیزاین پترن Adapter این مشکل حل میشود. راه حل موجود به این صورت هست که ما برای ارسال پیام یک اینترفیس به نام sendMessageInterface ایجاد میکنیم.

class telegram { 
 
   public function __construct() {
   // Your Code here //
    }
    public function sendMessage($message) {
    // send message //
     }
}
interface sendMessageInterface  {
       public function send($message);
}


و کلاس telegramAdapter را از آن اینترفیس implements میکنیم. حالا میتونیم متود ارسال پیام خودمان را در این کلاس telegramAdapter تعریف کنیم.

class telegramAdapter  implements sendMessageInterface {

    private $telegram;
    
    public function __construct(telegram $telegram) {
        $this->telegram = $telegram;
    }
    public function send($amount) {
        $this->telegram->sendMessage($message);
     }
}


حال اگر تلگرام API خود را تغییر دهد ، تنها کافیست که در کلاس telegramAdapter و متود send نام sendMessage را با نامی که تلگرام تعیین کرده است (که در سناریوی اول ما sendMsg است ) جایگزین کنیم.

دیزاین پترن Bridge

خب حالا دیزاین پترن Bridge ، این دیزان پترن تعریف های گوناگونی دارد برای همین سعی میکنم با مثال توضیح بدم.

ما برای ارسال یک پیام از دستگاه ها و پیام رسان های مختلفی استفاده میکنیم ، فرض کنید ما برنامه ای نوشته ایم که از API های واس آپ ، تلگرام و اسکایپ برای ارسال پیام کاربران بین دستگاه های مختلف استفاده میکنیم. خب اگر ما بخوایم برای هر دستگاه و پیام رسان کد جداگانه بنویسیم ، بیشتر کdدهای ما تکراری هستن و با کلی کد روبه رو میشیم ، اینجاست که دیزاین پترن Bridge به کمک ما میاد.


میریم سراغ کد این سناریو :

<?php

interface deviceInterface
{
        public function setSender(massaging $sender);
        public function send($body);
}
abstract class device implements deviceInterface
{
	protected $sender;	
	public function setSender(massaging $sender){
		$this->sender = $sender;
	}
}
class phone extends device
{
	public function send($body)
	{
		$this->sender->send($body." send by phone");
	}
}

class tablet extends device
{
	public function send($body)
	{
		$this->sender->send($body." send by tablet");
	}
}

interface massaging {
 	public function send($body);
}

class telegram implements massaging
{
	public function send($body) {
		echo $body;
	}
}

$phone = new phone;
$phone->setSender(new telegram);
$phone->send("hello");


همونطور که میبینید ما یک اینترفیس به نام deviceInterface ایجاد کردیم که دارای متودهای setSender

و send هستند ، سپس یک کلاس abstract به نام device ایجاد کردیم که از deviceInterface implements میشود (دلیل این کار رو میشه اینجوری توضیح داد که ما دیگه متود setSender رو توی کلاس های phone , tablet باز تکرار نکنیم). سپس کلاس های phone و tablet رو ایجاد میکنیم و متود send را متناسب با هرکدوم تعریف میکنیم، برای مسنجر ها هم به صورت دیوایس ها عمل میکنیم.

در نهایت مشاهده میکنید که با ساختن یه نمونه جدید از دستگاه مورد نظر و فرستادن یک نمونه ساخته شده از مسنجر مورد نظر در قالب آگومان به متود setSender ، به راحتی یه پیام را از طریق گوشی و پیام رسان تلگرام منتقل کردیم.

منابع :

https://code.tutsplus.com/tutorials/design-patterns-the-adapter-pattern--cms-22262
https://www.jakowicz.com/bridge-pattern-in-php/