روش قــالــبـــی (Template Method)
هـــدف
الگوی روش قالب (Template Method) یک الگوی طراحی رفتاری است که اسکلت یک الگوریتم را در کلاس فوق کلاس تعریف میکند اما به زیرکلاسها اجازه میدهد مراحل خاصی از الگوریتم را بدون تغییر ساختار آن بازنویسی کنند.
مـسئـــلـه
تصور کنید که در حال ایجاد یک برنامه دادهکاوی هستید که اسناد شرکتها را تجزیه و تحلیل میکند. کاربران اسناد را در فرمتهای مختلف (PDF، DOC، CSV) به برنامه میدهند و این برنامه سعی میکند دادههای معنیدار را از این اسناد در یک فرمت یکسان استخراج کند.
نسخه اول این برنامه فقط با فایلهای DOC کار میکرد. در نسخه بعدی، توانایی پشتیبانی از فایلهای CSV را پیدا کرد. یک ماه بعد، آن را “آموزش دادید” تا دادهها را از فایلهای PDF استخراج کند.
کلاسهای دادهکاوی حاوی کدهای تکراری زیادی بودند.
در برخی موارد، متوجه شدید که هر سه کلاس دارای کد مشابه زیادی هستند. در حالی که کد برای برخورد با فرمتهای مختلف داده در تمام کلاسها کاملاً متفاوت بود، کد پردازش و تجزیه داده تقریباً یکسان است. آیا از شر کد تکراری خلاص شدن و حفظ ساختار الگوریتم عالی نخواهد بود؟
مشکل دیگری مربوط به کد مشتری بود که از این کلاسها استفاده میکرد. این کد دارای شرایط زیادی بود که بسته به کلاس شیء پردازش، یک مسیر عمل مناسب را انتخاب میکرد. اگر هر سه کلاس پردازش یک رابط مشترک یا یک کلاس پایه داشتند، میتوانید شرطها را در کد مشتری حذف کنید و هنگام فراخوانی متدها روی یک شیء پردازش از چندشکلی استفاده کنید.
راهــکــــار
الگوی روش قالب پیشنهاد میکند که یک الگوریتم را به مجموعهای از مراحل تقسیم کنید، این مراحل را به متدها تبدیل کنید و مجموعهای از فراخوانیها به این متدها را در یک روش قالب واحد قرار دهید. این مراحل میتوانند انتزاعی یا دارای برخی پیادهسازیهای پیشفرض باشند. برای استفاده از الگوریتم، مشتری باید زیرکلاس خود را ارائه دهد، تمام مراحل انتزاعی را پیادهسازی کند و در صورت نیاز برخی از موارد اختیاری را بازنویسی کند (اما نه خود روش قالب).
بیایید ببینیم این چگونه در برنامه دادهکاوی ما اجرا خواهد شد. میتوانیم یک کلاس پایه برای هر سه الگوریتم تجزیه ایجاد کنیم. این کلاس یک روش قالب متشکل از مجموعهای از فراخوانیها به مراحل مختلف پردازش سند را تعریف میکند.
روش قالب الگوریتم را به مراحل تقسیم میکند و به زیرکلاسها اجازه میدهد این مراحل را بازنویسی کنند اما نه خود روش.
در ابتدا، میتوانیم تمام مراحل را انتزاعی اعلام کنیم و زیرکلاسها را مجبور کنیم پیادهسازیهای خود را برای این متدها ارائه دهند. در مورد ما، زیرکلاسها از قبل تمام پیادهسازیهای لازم را دارند، بنابراین تنها کاری که ممکن است نیاز داشته باشیم تنظیم امضاهای متدها برای مطابقت با متدهای کلاس فوق کلاس است.
اکنون، بیایید ببینیم چه کاری میتوانیم انجام دهیم تا از شر کد تکراری خلاص شویم. به نظر میرسد کد مربوط به باز کردن/بستن فایلها و استخراج/تجزیه دادهها برای فرمتهای مختلف داده متفاوت است، بنابراین هیچ دلیلی برای دست زدن به این متدها وجود ندارد. با این حال، پیادهسازی مراحل دیگر، مانند تجزیه و تحلیل دادههای خام و ترکیب گزارشها، بسیار مشابه است، بنابراین میتوان آن را در کلاس پایه قرار داد، جایی که زیرکلاسها میتوانند آن کد را به اشتراک بگذارند.
همانطور که میبینید، دو نوع مرحله داریم:
مراحل انتزاعی باید توسط هر زیرکلاس پیادهسازی شوند. مراحل اختیاری از قبل دارای برخی پیادهسازیهای پیشفرض هستند، اما همچنان میتوانند در صورت نیاز بازنویسی شوند.
نوع دیگری از مرحله وجود دارد که قلاب نامیده میشود. یک قلاب یک مرحله اختیاری با بدنه خالی است. یک روش قالب حتی اگر یک قلاب بازنویسی نشود نیز کار خواهد کرد. معمولاً قلابها قبل و بعد از مراحل حیاتی الگوریتمها قرار میگیرند و نقاط گسترش اضافی برای یک الگوریتم را برای زیرکلاسها فراهم میکنند.
مقایسه با دنیای واقعی
یک طرح معماری معمولی میتواند کمی تغییر کند تا بهتر با نیازهای مشتری سازگار شود.
رویکرد روش قالب میتواند در ساخت مسکن انبوه استفاده شود. طرح معماری برای ساخت یک خانه استاندارد ممکن است شامل چندین نقطه گسترش باشد که به یک صاحب بالقوه اجازه میدهد برخی جزئیات خانه نهایی را تنظیم کند.
هر مرحله ساختمانی، مانند ریختن فونداسیون، قاببندی، ساخت دیوارها، نصب لوله کشی و سیمکشی برای آب و برق و غیره، میتواند کمی تغییر کند تا خانه نهایی کمی متفاوت از دیگران شود.
ســاخــتـــار
برای مطـالعـه متن کامل مقالــه، مجموعه کــــدها، نحوه پیاده سازی، مزایا و معایب و روابط با الگوهای دیگر، ایــنــجـــا کلیک کنید.