
الگوی طراحـــــــــی Template Method
الگوی طراحی Template Method یک الگوی رایج در برنامهنویسی است که برای تعیین چارچوب یک الگوریتم و اجازه دادن به زیرکلاسها برای تغییر بخشهای مشخص آن الگوریتم بکار میرود. با استفاده از این الگو، یک الگوریتم را در یک کلاس پایه (Base class) تعریف میکنیم و قسمتهایی از آن الگوریتم را که ممکن است در زیرکلاسها متفاوت باشند، به صورت متدهای انتزاعی (abstract) تعریف میکنیم. سپس زیرکلاسها برای اجرای آن الگوریتم میتوانند متدهای انتزاعی را به دلخواه پیادهسازی کنند و بخشهای مختلف الگوریتم را متغیر کنند.
مفهوم الگوی Template Method به این صورت است که ما یک کلاس اصلی داریم که الگوریتم را تعریف میکند و متدهای انتزاعی را مشخص میکند. همچنین کلاسهای زیرکلاس از کلاس اصلی ارثبری کرده و متدهای انتزاعی را پیادهسازی میکنند.
الگوی Template Method به ما امکان میدهد از روی یک پایه مشترک، الگوریتمهای مختلفی را ایجاد کنیم که هماهنگی زیادی با هم داشته و بخشهای مشابهی را با هم به اشتراک میگذارند.
حالا با یک مثال واقعی از الگوی Template Method در زبان سی شارپ آشنا میشویم:
فرض کنید ما یک برنامه برای ساختن محصولات مختلف داریم و هر محصول به صورت مراحلی ساخته میشود. این مراحل شامل تعیین مشخصات، تولید، بستهبندی و ارسال محصول میباشد. با استفاده از الگوی Template Method، اجازه میدهیم که بخشهای مشترک بین محصولات را در کلاس پایه تعریف کنیم و بخشهای متفاوت را در زیرکلاسها پیادهسازی کنیم.
1. کلاس پایه (Base class):
1public abstract class ProductBuilder
2{
3 public void BuildProduct()
4 {
5 SetSpecifications();
6 Produce();
7 Package();
8 Ship();
9 }
10
11 protected abstract void SetSpecifications();
12 protected abstract void Produce();
13 protected abstract void Package();
14 protected abstract void Ship();
15}
2. زیرکلاسها:
1public class PhoneBuilder : ProductBuilder
2{
3 protected override void SetSpecifications()
4 {
5 Console.WriteLine("Setting phone specifications.");
6 }
7
8 protected override void Produce()
9 {
10 Console.WriteLine("Producing a phone.");
11 }
12
13 protected override void Package()
14 {
15 Console.WriteLine("Packaging the phone.");
16 }
17
18 protected override void Ship()
19 {
20 Console.WriteLine("Shipping the phone.");
21 }
22}
23
24public class LaptopBuilder : ProductBuilder
25{
26 protected override void SetSpecifications()
27 {
28 Console.WriteLine("Setting laptop specifications.");
29 }
30
31 protected override void Produce()
32 {
33 Console.WriteLine("Producing a laptop.");
34 }
35
36 protected override void Package()
37 {
38 Console.WriteLine("Packaging the laptop.");
39 }
40
41 protected override void Ship()
42 {
43 Console.WriteLine("Shipping the laptop.");
44 }
45}
3. Client (کلاینت):
1public class Program
2{
3 public static void Main()
4 {
5 // ساختن یک تلفن
6 ProductBuilder phoneBuilder = new PhoneBuilder();
7 phoneBuilder.BuildProduct();
8
9 // ساختن یک لپتاپ
10 ProductBuilder laptopBuilder = new LaptopBuilder();
11 laptopBuilder.BuildProduct();
12 }
13}
خروجی برنامه به صورت زیر خواهد بود:
Setting phone specifications.
Producing a phone.
Packaging the phone.
Shipping the phone.
Setting laptop specifications.
Producing a laptop.
Packaging the laptop.
Shipping the laptop.
در این مثال، با استفاده از الگوی Template Method، ما یک برنامه ساخت محصولات مختلف (مثلاً تلفن و لپتاپ) را ایجاد کردیم. کلاس پایه ProductBuilder الگوریتم کلی ساخت یک محصول را تعریف میکند که شامل مراحل تعیین مشخصات، تولید، بستهبندی و ارسال است. سپس زیرکلاسها (PhoneBuilder و LaptopBuilder) برای هر محصول متدهای انتزاعی را پیادهسازی میکنند تا بخشهای مختلف الگوریتم متغیر شوند و به تعداد محصولات مختلف الگوریتمهای جدیدی ایجاد کنیم. این الگو امکان توسعهپذیری سیستم را بالا میبرد و باعث از بین بردن تکرار کد در مراحل مشترک ساخت محصولات مختلف میشود.