آداپتور mahdi.sg مرداد ۲۶, ۱۴۰۳

آداپتـــور(مـُبــــــدِل)


هـــدف
آداپتور یک الگوی طراحی ساختاری است که به اشیاء با رابط‌های ناسازگار اجازه همکاری می‌دهد.
Adapter design pattern
مـسئـــلـه

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

در برخی مواقع، تصمیم می‌گیرید برنامه را با ادغام یک کتابخانه تحلیلی هوشمند شخص ثالث بهبود بخشید. اما یک مشکل وجود دارد: کتابخانه تحلیلی فقط با داده‌ها در قالب JSON کار می‌کند.

The structure of the app before integration with the analytics library

نمی‌توانید از کتابخانه تجزیه و تحلیل «همان‌طور که هست» استفاده کنید زیرا انتظار دارد داده‌ها در قالبی ناسازگار با برنامه شما باشد.

می‌توانید کتابخانه را طوری تغییر دهید که با XML کار کند. با این حال، این ممکن است برخی از کدهای موجود که به کتابخانه وابسته هستند را خراب کند. و بدتر از آن، ممکن است در وهله اول به کد منبع کتابخانه دسترسی نداشته باشید که این رویکرد را غیرممکن می‌کند.

می‌توانید یک آداپتور ایجاد کنید. این یک شیء خاص است که رابط یک شی را به گونه‌ای تبدیل می‌کند که شی دیگری بتواند آن را درک کند.

یک آداپتور یکی از اشیاء را می‌پوشاند تا پیچیدگی تبدیل اتفاق افتاده در پشت صحنه را پنهان کند. شی پوشیده شده حتی از وجود آداپتور آگاه نیست. به عنوان مثال، می‌توانید یک شیء که با متر و کیلومتر کار می‌کند را با یک آداپتور بپوشانید که تمام داده‌ها را به واحدهای امپریال مانند فوت و مایل تبدیل می‌کند.

آداپتورها نه تنها می‌توانند داده‌ها را به فرمت‌های مختلف تبدیل کنند، بلکه می‌توانند به اشیاء با رابط‌های مختلف در همکاری کمک کنند. اینگونه کار می‌کند:

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

 

Adapter's solution

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

 

The Adapter pattern example

یک چمدان قبل و بعد از سفر به خارج از کشور.
وقتی برای اولین بار از ایالات متحده به اروپا سفر می‌کنید، ممکن است هنگام تلاش برای شارژ لپ‌تاپ خود متعجب شوید. استانداردهای پریز و پلاگین برق در کشورهای مختلف متفاوت است. به همین دلیل است که پلاگین آمریکایی شما در سوکت آلمانی جا نمی‌شود. این مشکل را می‌توان با استفاده از یک آداپتور پلاگین برق که دارای سوکت آمریکایی و پلاگین اروپایی است، حل کرد.
ســاخــتـــار

آداپـــتـــور شئ‌گــــرا

این پیاده سازی از اصل ترکیب شی استفاده می کند: آداپتور رابط یک شی را پیاده سازی می کند و شی دیگر را می پیچد. می توان آن را در تمام زبان های برنامه نویسی رایج پیاده سازی کرد.
Structure of the Adapter design pattern (the object adapter)
آداپـــتـــور کلاسی
این پیاده سازی از وراثت استفاده می کند: آداپتور رابط ها را از هر دو شی به طور همزمان به ارث می برد. توجه داشته باشید که این رویکرد فقط در زبان‌های برنامه‌نویسی که از وراثت چندگانه پشتیبانی می‌کنند، مانند C++ قابل پیاده‌سازی است.
Adapter design pattern (class adapter)
برای مطـالعـه متن کامل مقالــه، مجموعه کــــدها، نحوه پیاده سازی، مزایا و معایب و روابط با الگوهای دیگر، ایــنــجـــا کلیک کنید.