دیزاین پترن
Strategy یکی از دیزاین پترن های رایج معماری نرمافزاری است که در آن یک خانواده از الگوریتمها یا روشهای مختلف ارائه میشود و این امکان را به کاربر میدهد که در زمان اجرای برنامه، یکی از این الگوریتمها را انتخاب کند و از آن استفاده کند.فرض کنید که شما یک برنامه برای محاسبه قیمت نهایی محصولات در یک فروشگاه آنلاین طراحی میکنید. قیمت نهایی هر محصول بسته به شرایط مختلف میتواند به روشهای مختلفی محاسبه شود. مثلاً برخی از محصولات ممکن است با تخفیفهای ویژهای به فروش برسند، برخی دیگر با توجه به نوع مشتری (حقیقی یا حقوقی) با قیمت متفاوت عرضه شوند و برخی ممکن است به صورت ثابت به فروش برسند.
مثال:
ابتدا یک اینترفیس برای استراتژیها تعریف میکنیم که متد محاسبه قیمت نهایی محصول را دارد.
interface PricingStrategy {
public function calculateFinalPrice(float $price): float;
}
سپس برای هر روش محاسبه قیمت نهایی محصول، یک کلاس را پیادهسازی میکنیم که از این اینترفیس ارثبری کند و متد محاسبه قیمت را به شکل متناسب با الگوریتمهای خود پیادهسازی کند.class RegularPricingStrategy implements PricingStrategy {
public function calculateFinalPrice(float $price): float {
return $price;
}
}
class DiscountPricingStrategy implements PricingStrategy {
private $discountPercentage;
public function __construct(float $discountPercentage) {
$this->discountPercentage = $discountPercentage;
}
public function calculateFinalPrice(float $price): float {
$discountAmount = $price * ($this->discountPercentage / 100);
return $price - $discountAmount;
}
}
class SpecialCustomerPricingStrategy implements PricingStrategy {
private $specialPrice;
public function __construct(float $specialPrice) {
$this->specialPrice = $specialPrice;
}
public function calculateFinalPrice(float $price): float {
return $this->specialPrice;
}
}
حالا میتوانیم در برنامهی خود از دیزاین پترن استراتژی استفاده کنیم و به راحتی یکی از روشهای محاسبه قیمت را برای هر محصول انتخاب کنیم.$strategy = new SpecialCustomerPricingStrategy(10);Result:
$price = 100;
$finalPrice = $strategy->calculateFinalPrice($price);
echo "Final Price: $finalPrice";
Final Price: 90
در این مثال، از دیزاین پترن
Strategy برای جداسازی الگوریتمهای مختلف محاسبه قیمت نهایی محصول استفاده کردیم. با استفاده از این الگو، میتوانیم به راحتی یکی از روشهای مختلف محاسبه قیمت را انتخاب کنیم و از آن استفاده کنیم، بدون اینکه نیاز به تغییر در کد برنامهی خود داشته باشیم. همچنین، با اضافه کردن استراتژیهای جدید، میتوانیم به سادگی قابلیتهای جدید به برنامهی خود اضافه کنیم بدون تغییر در کد موجود..