روش قــالــبـــی mahdi.sg مرداد ۲۸, ۱۴۰۳

روش قــالــبـــی (Template Method)


هـــدف

الگوی روش قالب (Template Method) یک الگوی طراحی رفتاری است که اسکلت یک الگوریتم را در کلاس فوق کلاس تعریف می‌کند اما به زیرکلاس‌ها اجازه می‌دهد مراحل خاصی از الگوریتم را بدون تغییر ساختار آن بازنویسی کنند.

Template method design pattern

مـسئـــلـه

تصور کنید که در حال ایجاد یک برنامه داده‌کاوی هستید که اسناد شرکت‌ها را تجزیه و تحلیل می‌کند. کاربران اسناد را در فرمت‌های مختلف (PDF، DOC، CSV) به برنامه می‌دهند و این برنامه سعی می‌کند داده‌های معنی‌دار را از این اسناد در یک فرمت یکسان استخراج کند.

نسخه اول این برنامه فقط با فایل‌های DOC کار می‌کرد. در نسخه بعدی، توانایی پشتیبانی از فایل‌های CSV را پیدا کرد. یک ماه بعد، آن را “آموزش دادید” تا داده‌ها را از فایل‌های PDF استخراج کند.

Data mining classes contained a lot of duplicate code

کلاس‌های داده‌کاوی حاوی کدهای تکراری زیادی بودند.

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

مشکل دیگری مربوط به کد مشتری بود که از این کلاس‌ها استفاده می‌کرد. این کد دارای شرایط زیادی بود که بسته به کلاس شیء پردازش، یک مسیر عمل مناسب را انتخاب می‌کرد. اگر هر سه کلاس پردازش یک رابط مشترک یا یک کلاس پایه داشتند، می‌توانید شرط‌ها را در کد مشتری حذف کنید و هنگام فراخوانی متدها روی یک شیء پردازش از چندشکلی استفاده کنید.

الگوی روش قالب پیشنهاد می‌کند که یک الگوریتم را به مجموعه‌ای از مراحل تقسیم کنید، این مراحل را به متدها تبدیل کنید و مجموعه‌ای از فراخوانی‌ها به این متدها را در یک روش قالب واحد قرار دهید. این مراحل می‌توانند انتزاعی یا دارای برخی پیاده‌سازی‌های پیش‌فرض باشند. برای استفاده از الگوریتم، مشتری باید زیرکلاس خود را ارائه دهد، تمام مراحل انتزاعی را پیاده‌سازی کند و در صورت نیاز برخی از موارد اختیاری را بازنویسی کند (اما نه خود روش قالب).

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

Template method defines the skeleton of the algorithm

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

در ابتدا، می‌توانیم تمام مراحل را انتزاعی اعلام کنیم و زیرکلاس‌ها را مجبور کنیم پیاده‌سازی‌های خود را برای این متدها ارائه دهند. در مورد ما، زیرکلاس‌ها از قبل تمام پیاده‌سازی‌های لازم را دارند، بنابراین تنها کاری که ممکن است نیاز داشته باشیم تنظیم امضاهای متدها برای مطابقت با متدهای کلاس فوق کلاس است.

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

همانطور که می‌بینید، دو نوع مرحله داریم:

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

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

 

Mass housing construction

یک طرح معماری معمولی می‌تواند کمی تغییر کند تا بهتر با نیازهای مشتری سازگار شود.

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

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

ســاخــتـــار

 

Structure of the Template Method design pattern

 

 

برای مطـالعـه متن کامل مقالــه، مجموعه کــــدها، نحوه پیاده سازی، مزایا و معایب و روابط با الگوهای دیگر، ایــنــجـــا کلیک کنید.