آداپتر پترن در اصل یک دیزاین پترن از نوع Structural است که به شما این امکان را میدهد تا یک کلاس را با اینترفیس متفاوتی نیز سازگار کنید؛ این کار امکان استفاده از کلاس توسط سیستمی که از متدهای فراخوانی مختلفی استفاده میکند را امکانپذیر مینماید.
یک آداپتور به دو رابط ناسازگار اجازه میدهد تا بتوانند با هم کار کنند. این یک تعریف کلی از مفهوم آداپتور است. ممکن است رابط ها ناسازگار باشند ولی قابلیت درونی آنها باید سازگار با نیاز باشد. الگوی طراحی آداپتور از طریق تبدیل رابط یک کلاس به رابط مورد انتظار توسط کلاینت، به کلاسهای ناسازگار اجازه میدهد تا بتوانند از قابلیتهای همدیگر استفاده کنند.
این پترن همچنین به شما امکان تغییر برخی از ورودیهایی را میدهد که از کلاینت کلاس دریافت شده که باعث میشود بتوانید آنها را به چیزی که با فانکشنهای این پترن نیز همخوانی داشته باشد تبدیل نمایید.
اصطلاح دیگری که به مفهوم آداپتر کلاس اشاره دارد، Wrapper است که درواقع به شما اجازه میدهد اعمالی را در داخل یک کلاس اصطلاحاً Wrap (بستهبندی) کنید و این عملها را در موقعیتهای مناسبی مورد استفاده قرار دهید. بهعنوان مثال، به جای فراخوانی کلاسهای متفاوت و صدا زدن فانکشنهای آنها به صورت تکبهتک، میتوانید تمامی این متدها را در یک متد واحد توسط کلاس آداپتر اصطلاحاً Encapsulate کنید.
دو نوع الگوی آداپتور وجود دارد
الگوی آداپتور شئ
در این نوع الگوی آداپتور، آداپتور حاوی یک نمونه (شیء) از کلاسی است که آن را در بر میگیرد. در این حالت، آداپتور از این شیء برای رفع نیازهای تعیین شده استفاده میکند.
الگوی آداپتور کلاس
این نوع آداپتور از رابط های چندریختی استفاده می کند.
این کار نهتنها امکان استفادهٔ مجدد از این اعمال را به هر صورت که بخواهید به شما میدهد، بلکه از بازنویسی کدهای مربوط به یک عمل خاص، که قصد استفاده از آنها در مکان دیگری دارید نیز جلوگیری میکند. اگر بخواهیم بدون استفاده از آداپتر پترن کدنویسی کنیم، کدی همچون زیر خواهیم داشت:
$user = new User();
$user->CreateOrUpdate( //inputs );
$profile = new Profile();
$profile->CreateOrUpdate( //inputs );
اگر بخواهیم این کار را در جای دیگری نیز تکرار کنیم یا از این کد در پروژهٔ دیگری استفاده کنیم، باید دست به کار شده و تمام کدها را بازنویسی کنیم؛ لذا دقیقاً برعکس حالت قبل و با استفاده از آداپتر پترن، میتوانیم کد بهتری بنویسیم:
$account_domain = new Account();
$account_domain->NewAccount( //inputs );
در این موارد، ما یک کلاس بهاصطلاح Wrapper داریم که قرار است حوزهای برای کلاس Account ما باشد:
class Account()
{
public function NewAccount( //inputs )
{
$user = new User();
$user->CreateOrUpdate( //subset of inputs );
$profile = new Profile();
$profile->CreateOrUpdate( //subset of inputs );
}
}
به این ترتیب، میتوانید از کلاس Account هر وقت که بخواهید استفاده کنید؛ علاوه بر این، میتوانید کلاسهای دیگری را نیز درون دامین کلاستان جای داده یا بهتر بگوییم Wrap کنید.
دیدگاه و پرسش
در حال دریافت نظرات از سرور، لطفا منتظر بمانید
در حال دریافت نظرات از سرور، لطفا منتظر بمانید