وقتی توی کدت به تابعی میرسی که پر از
if/else یا switch-case هست و هر بار رفتار متفاوتی اجرا میکنه (مثلاً روشهای مختلف پرداخت، الگوریتمهای مختلف مرتبسازی، یا استراتژیهای مختلف تخفیف)، احتمالاً وقتشه سراغ الگوی Strategy بری.
ایده اصلی ساده است:
بهجای اینکه منطق تصمیمگیری رو توی یک کلاس یا تابع بزرگ قایم کنی، هر رفتار رو توی یک کلاس جدا (یک «استراتژی») پیادهسازی میکنی که همه از یک قرارداد مشترک (interface) پیروی میکنن. کلاس اصلی فقط یکی از این استراتژیها رو نگه میداره و در زمان اجرا صداش میزنه، بدون اینکه بدونه دقیقاً چه الگوریتمی پشتش هست.
فایدهاش کجاست؟ اضافه کردن یک روش پرداخت جدید یا یک الگوریتم تخفیف جدید یعنی فقط یک کلاس جدید بنویسی، بدون دستزدن به کد قبلی. این دقیقاً همون اصل Open/Closed از SOLID هست:
باز برای توسعه، بسته برای تغییر.
یک مثال ساده با تخفیف:
interface DiscountStrategy {
apply(price: number): number;
}
class NoDiscount implements DiscountStrategy {
apply(price: number) { return price; }
}
class PercentageDiscount implements DiscountStrategy {
constructor(private percent: number) {}
apply(price: number) {
return price * (1 - this.percent / 100);
}
}
class Cart {
constructor(private strategy: DiscountStrategy) {}
checkout(price: number) {
return this.strategy.apply(price);
}
}
const cart = new Cart(new PercentageDiscount(20));
console.log(cart.checkout(100)); // 80یک نکته: Strategy رو با Factory اشتباه نگیر؛Factoryبرای ساختن آبجکتهاست، ولیStrategyبرای انتخاب رفتار (الگوریتم) در زمان اجراست. خیلی وقتها هم این دو کنار هم استفاده میشن.
#برنامه_نویسی #DesignPatterns
#طراحی_نرمافزار #TypeScript #Clean_Code
کانال آموزشی کدنایت | آموزش برنامه نویسی
🆔 https://t.me/codenight_ir