میانجی ( Mediator)
هـــدف
میانجی یک الگوی طراحی رفتاری است که به شما امکان میدهد وابستگیهای آشفته بین اشیاء را کاهش دهید. این الگو ارتباطات مستقیم بین اشیاء را محدود میکند و آنها را مجبور میکند که فقط از طریق یک شیء میانجی با هم همکاری کنند.
مـسئـــلـه
فرض کنید یک کادر محاورهای برای ایجاد و ویرایش پروفایل مشتریان دارید. این کادر محاورهای از کنترلهای مختلف فرم مانند فیلدهای متنی، کادرهای انتخاب، دکمهها و غیره تشکیل شده است.
روابط بین عناصر رابط کاربری با تکامل برنامه میتواند آشفته شود.
برخی از عناصر فرم ممکن است با یکدیگر تعامل داشته باشند. به عنوان مثال، انتخاب کادر انتخاب “من یک سگ دارم” ممکن است یک فیلد متنی پنهان را برای وارد کردن نام سگ نشان دهد. مثال دیگر دکمه ارسال است که باید قبل از ذخیره دادهها، مقادیر همه فیلدها را اعتبارسنجی کند.
عناصر میتوانند روابط زیادی با عناصر دیگر داشته باشند.
از این رو، تغییرات در برخی عناصر ممکن است روی سایرین تأثیر بگذارد.
با پیادهسازی مستقیم این منطق در کد عناصر فرم، استفاده مجدد از این کلاسهای عناصر در فرمهای دیگر برنامه بسیار دشوار میشود. به عنوان مثال، نمیتوانید از آن کلاس کادر انتخاب در فرم دیگری استفاده کنید، زیرا به فیلد متنی سگ مرتبط است. شما میتوانید یا از همه کلاسهای درگیر در رندر کردن فرم پروفایل استفاده کنید یا اصلاً از هیچکدام استفاده نکنید.
راهــکــــار
الگوی میانجی پیشنهاد میکند که باید تمام ارتباطات مستقیم بین اجزایی که میخواهید مستقل از یکدیگر باشند، قطع کنید. در عوض، این اجزا باید به صورت غیرمستقیم، با فراخوانی یک شیء میانجی خاص، با هم همکاری کنند. در نتیجه، اجزا فقط به یک کلاس میانجی تکیه میکنند و به دهها همکار خود متصل نیستند.
در مثال ما با فرم ویرایش پروفایل، خود کلاس دیالوگ ممکن است به عنوان میانجی عمل کند. به احتمال زیاد، کلاس دیالوگ از قبل از تمام زیر عناصر خود آگاه است، بنابراین حتی نیازی به معرفی وابستگیهای جدید به این کلاس نخواهید داشت.
عناصر UI باید به صورت غیرمستقیم، از طریق شیء میانجی، ارتباط برقرار کنند.
بزرگترین تغییر در عناصر واقعی فرم اتفاق میافتد. بیایید دکمه ارسال را در نظر بگیریم. قبلاً، هر بار که کاربر روی دکمه کلیک میکرد، باید مقادیر تمام عناصر فرم را اعتبارسنجی میکرد. اکنون کار اصلی آن اطلاع دادن به دیالوگ درباره کلیک است. پس از دریافت این اطلاع، خود دیالوگ اعتبارسنجیها را انجام میدهد یا کار را به عناصر فردی منتقل میکند. بنابراین، به جای گره خوردن به یک دوجین عنصر فرم، دکمه فقط به کلاس دیالوگ وابسته است.
میتوانید با استخراج رابط مشترک برای همه انواع دیالوگها، وابستگی را حتی سستتر کنید. رابط روش اطلاعرسانی را اعلام میکند که تمام عناصر فرم میتوانند از آن برای اطلاع دادن به دیالوگ درباره رویدادهای اتفاق افتاده در آن عناصر استفاده کنند. بنابراین، دکمه ارسال ما اکنون باید بتواند با هر دیالوگی که آن رابط را پیادهسازی میکند کار کند.
به این ترتیب، الگوی میانجی به شما امکان میدهد یک شبکه پیچیده از روابط بین اشیاء مختلف را در یک شیء میانجی واحد کپسوله کنید. هرچه یک کلاس وابستگی کمتری داشته باشد، اصلاح، گسترش یا استفاده مجدد از آن کلاس آسانتر میشود.
مقایسه با دنیای واقعی
خلبانان هواپیما هنگام تصمیمگیری در مورد اینکه چه کسی هواپیمای خود را فرود آورد،
مستقیماً با یکدیگر صحبت نمیکنند. تمام ارتباطات از طریق برج مراقبت انجام میشود.
خلبانان هواپیماهایی که به منطقه کنترل فرودگاه نزدیک میشوند یا از آن خارج میشوند، مستقیماً با یکدیگر ارتباط برقرار نمیکنند. در عوض، آنها با یک کنترلکننده ترافیک هوایی صحبت میکنند که در یک برج بلند جایی در نزدیکی باند فرودگاه نشسته است. بدون کنترلکننده ترافیک هوایی، خلبانان باید از هر هواپیمایی در مجاورت فرودگاه آگاه باشند و با یک کمیته متشکل از دهها خلبان دیگر در مورد اولویتهای فرود بحث کنند. این احتمالاً آمار سقوط هواپیما را افزایش میدهد.
برج نیازی به کنترل کل پرواز ندارد. برج فقط برای اعمال محدودیتها در منطقه ترمینال وجود دارد زیرا تعداد بازیگران درگیر در آنجا ممکن است برای یک خلبان غالب باشد.
ســاخــتـــار
برای مطـالعـه متن کامل مقالــه، مجموعه کــــدها، نحوه پیاده سازی، مزایا و معایب و روابط با الگوهای دیگر، ایــنــجـــا کلیک کنید.