الگوی facade
شناسه پست: 3180
بازدید: 951

در این مقاله ما قصد داریم به یک الگوی طراحی دیگر در سی شارپ بپردازیم که این بار یک الگوی ساختاری است. این الگو، الگوی Facade است.

این مقاله، بخشی از مجموعه آموزشی زیر است:

سورس کد در این لینک موجود است: الگوی طراحی Facade – سورس کد.

برای مشاهده لیست کامل مقالات این مجموعه آموزشی، الگوهای طراحی #C را بررسی کنید.

برای شروع، ما قصد داریم این مقاله را به بخش های زیر تقسیم کنیم:

الگوی Facade چیست؟

همانطور که از نام آن پیداست، نمایانگر یک “نما” برای کاربر نهایی است تا استفاده از زیرسیستم هایی را که طراحی ضعیف و یا خیلی پیچیده دارند را با پنهان کردن جزئیات پیاده سازی آنها، ساده سازی کند. همچنین هنگام کار با کتابخانه های پیچیده و API ها مفید است.

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

مثال الگوی Facade

به عنوان یک مثال، برای بیان بهتر الگوی Facade، قصد داریم workflow سفارش آنلاین غذا را شرح دهیم.

فرض کنید فهرستی از رستوران ها را داریم. صفحه رستوران را باز میکنیم. غذای مورد علاقه خود را پیدا می کنیم و به سبد خرید اضافه می کنیم. هر چند بار که بخواهیم این کار را انجام می دهیم و سفارش را تکمیل می کنیم. هنگام ارسال سفارش، تاییدیه سفارش به همراه قیمت سفارش را دریافت می کنیم.

ابتدا، بیایید یک کلاس به نام Order ایجاد کنیم که نشان دهنده سفارشی است که از سمت کاربر می آید:

علاوه بر این، باید دو کلاس دیگر اضافه کنیم. یکی online restaurant و دیگری shipping service. کلاس OnlineRestaurant، متدهایی را برای افزودن سفارشات به سبد خرید ارائه میدهد:

از طرف دیگر، کلاس ShippingService سفارش را گرفته و آنها را به آدرس ذخیره شده در ویژگی ShippingAddress داخل کلاس Order ارسال می کند. ShippingService همچنین هزینه های حمل و نقل را محاسبه کرده و به کاربر نمایش می دهد:

در پایان، ما کل منطق را در کلاس Main گنجانده ایم تا workflow سفارش آنلاین غذا را نشان دهیم:

نتیجه پیاده سازی فعلی کلاس Main به صورت زیر است:

مثال الگوی facade

نکته: فرض ما بر این است که سفارشات ما از بیرون می آید و به این دلیل است که آنها را داخل کلاس Main ایجاد کرده ایم. این اختیاری است، البته، برای سیستم های پیچیده تر، این نیز بخشی از service است.

حال، برای کسانی از شما که در تعجب هستید:

“چرا این اشتباه است؟”

در ادامه به آن میپردازیم.

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

و این جایی است که الگوی Facade وارد عمل میشود.

پیاده سازی الگوی Facade

یکی از اهداف الگوی Facade مخفی کردن جزئیات پیاده سازی است که نشان می دهد وجود همه چیز در کلاس Main درست نیست. این اطلاعات بیش از حد غیر ضروری است، بنابراین، ما دوست داریم آن را در جای بهتری داشته باشیم.

با این اوصاف، ما قصد داریم کلاس دیگری به نام Facade ایجاد کنیم. کلاس Facade به عنوان یک “میان افزار” بین کاربر و پیچیدگی سیستم بدون تغییر business logic عمل میکند:

از آنجایی که ما منطق پیاده سازی را به کلاس Facade منتقل کرده ایم، می توانیم کلاس Main را ساده سازی کنیم:

وقتی کد را اجرا می کنیم، می توانیم همان خروجی دقیق را ببینیم:

مثال الگوی facade

این بدان معنی است که ما با موفقیت، کاربر را از فشار غیر ضروری دانستن تمام مراحل لازم برای رسیدن غذا رها کرده ایم.

توجه: در این مثال، OnlineRestaurant و ShippingService را به Facade منتقل کرده ایم، با این فرض که از قبل ایجاد شده اند. با این حال، آنها را می توان در داخل خود Facade نیز نمونه سازی کرد.

نتیجه گیری

بنابراین، ما دیدیم که چگونه الگوی Facade می تواند به ما در آسان کردن کار client کمک کند. اکنون، ما آماده ایم پیاده سازی های پیچیده را همانطور که هست بپذیریم. و نکته آخر اینکه در شرایط خاص، استفاده از این الگو مستلزم دقت است. چرا که آن می‌تواند توانایی‌های کاربر را برای استفاده از پتانسیل کامل برنامه یا کتابخانه‌ای که ما در تلاش برای ساده‌سازی آن هستیم، محدود کند.

نویسنده

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