در الگوی Template Method، ساختار یک الگوریتم را تعریف می کنیم و مراحل آن را به subclassها واگذار می کنیم.
گاهی با مسائلی روبرو هستیم که مراحل یکسانی از یک الگوریتم را می بینیم و نحوه implementation متفاوتی دارند.
برای مثال، کلاسی را در نظر بگیرید که قرار است یک فایل را ذخیره کند.
public abstract class FileProcessor { public void Process() { var files = GetUnProcessedFiles(); foreach(var file in files) { file = BeforeProcessingFile(file); ProcessFile(file); CompressFile(file); AddToArchive(file); } } public void CompressFile(File file) { .... } public virtual void AddToArchive(File file) { .... } public virtual File BeforeProcessingFile(File file) { return file; } public abstract void ProcessFile(File file); public abstract void GetUnProcessedFiles(File file); }
در مورد یک کلاس صحبت می کنیم که الگوریم انجام یک کاری را تعریف می کند اما نحوه implementation آن را به subclassها واگذار می کند. فرض کنید در اینجا فایل هایی با فرمت های متفاوت می گیریم و با منطق یکسانی پردازش می کنیم.
public class XmlProcessor : FileProcessor { public override void ProcessFile(File file) {....} public override void GetUnProcessedFiles(File file) {....} }
به این شکل، ما نسبت به ترتیب اجرای اجزا آگاهی داریم و به دنبال این هستیم که بعضی از این مراحل در subclassها customize شوند.
در template method پنج دسته متد را می توانیم فراخوانی کنیم.
دسته ای از operationهایی هستند که داخل base class پیاده سازی می شوند و ممکن است در subclassها override شوند. در مثال ما متد AddToArchive می باشد.
دسته ای از operationهایی هستند که داخل base class پیاده سازی می شوند و subclassها با آنها کاری ندارند. در مثال ما متد CompressFile می باشد.
دسته ای از operationهایی هستند که پیاده سازی آن ها به subclassها واگذار شده است.
دسته ای از operationهایی هستند که سازنده هستند و در دسته factory methodها قرار می گیرند.
دسته ای از operationهایی هستند که به آن ها hook operations گفته می شود که ما در base class می گذاریم. معمولا یک پیاده سازی پیش فرض دارند و اجباری در پیاده سازی آن ها نیست. در مثال ما متد BeforeProcessingFile می باشد. این امکان را به subclassها می دهد که بر روی file تغییراتی را اعمال کنند.
به طور خلاصه، در این الگو مساله inheritance وجود دارد. فرآیند و مراحل انجام یک کار در این الگو را به عنوان commonality در نظر می گیریم و بدنه مراحل و نحوه implementation مراحل که می توانند در پیاده سازی های مختلف، متفاوت باشند را به عنوان variability در نظر می گیریم.