دیزاین پترن
Template Method یکی از الگوهای رفتاری است که در طراحی نرمافزارها مورد استفاده قرار میگیرد. این الگو به شما امکان میدهد یک چارچوب اصلی برای یک الگوریتم تعریف کنید که بخشهایی از آن را به کلاسهای زیرمجموعه خود میسپارید تا به صورت مستقل اجرا شوند. با این روش، تغییرات در الگوریتم اصلی به کلاسهای زیرمجموعه انتقال پیدا نمیکند و همچنین از دسترسی به متدهای مشترک و ارتباط موثر با آنها برخوردار خواهید بود.فرض کنید که میخواهیم یک کلاس برای ساخت یک نوشیدنی دمنوش تعریف کنیم که از دو مرحله پیشتهیه (
Prepare) و تهیه (Brew) تشکیل شده است. این کلاس باید اجازه دهد که بخشهایی از فرآیند دمنوشسازی توسط subclass ها (نمونهها) اجرا شوند.مثال:
ابتدا این کلاس یک الگوریتم اصلی برای ساخت نوشیدنی دمنوش ارائه میدهد که شامل مراحل Prepare و Brew است.
abstract class Beverageسپس
{
public function makeBeverage()
{
$this->boilWater();
$this->brew();
$this->pourInCup();
$this->addCondiments();
}
public function boilWater()
{
echo "Boiling water...\n";
}
public function pourInCup()
{
echo "Pouring into cup...\n";
}
// Methods required by subclasses must be defined here
abstract public function brew();
abstract public function addCondiments();
}
subclass ها با توجه به نوشیدنی موردنظر، متدهای brew و addCondiments را پیادهسازی میکنند.class Tea extends Beverageحالا میتوانیم از کلاسها و زیرکلاسهای آنها برای ساخت نوشیدنی دمنوش استفاده کنیم.
{
public function brew()
{
echo "Steeping the tea...\n";
}
public function addCondiments()
{
echo "Adding lemon...\n";
}
}
class Coffee extends Beverage
{
public function brew()
{
echo "Dripping coffee through filter...\n";
}
public function addCondiments()
{
echo "Adding sugar and milk...\n";
}
}
$tea = new Tea();Result:
$tea->makeBeverage();
Boiling water...
Steeping the tea...
Pouring into cup...
Adding lemon...
$coffee = new Coffee();Result:
$coffee->makeBeverage();
Boiling water...
Dripping coffee through filter...
Pouring into cup...
Adding sugar and milk...
در این مثال، با استفاده از دیزاین پترن
Template Method، یک چارچوب اصلی برای ساخت نوشیدنی دمنوش با مراحل مشترک boilWater و pourInCup تعریف کردیم و بخشهای خاص هر نوشیدنی را در subclass ها تعیین کردیم. این الگو باعث از دست رفتن تکرار کد، افزایش قابلیت توسعه و حفظ ساختار یکپارچهای در کلاسها میشود..