الگوی استراتژی

در برنامه‌نویسی کامپیوتر **الگوی استراتژی** (همچنین به عنوان **الگوی سیاست** و **الگوی راهبردگُزین** نیز شناخته می‌شود) است یک الگوی طراحی نرم‌افزار رفتاری است که قابلیت انتخاب یک الگوریتم در زمان اجرا را ممکن می‌سازد.

در الگوی استراتژی:

# یک میانای (Interface) تعریف می‌شود.
# چندین راهبرد جداگانه اما در پیوند با یک زمینهٔ ویژه، پیاده‌سازی می‌گردد.
# هر راهبرد در کلاس جداگانه پوشانده (Encapsulate) می‌شود و شگرد (Method) همسان برای اجرا دارد.
# میانای، مرجعی به یک راهبرد اولیه نگه می‌دارد و در زمان اجرا (Runtime) می‌تواند راهبردها را با یکدیگر جایگزین کند؛ بنابراین راهبردها جایگزین‌پذیر هستند.

الگوی استراتژی اجازه می‌دهد تا الگوریتم‌های گوناگون به شکل جداگانه و مستقل از کارخواه اجرا شوند. الگوی استراتژی یکی از الگوهای موجود در کتاب مشهور *[[الگوهای طراحی]]* است که توسط گاما و دیگران نوشته شده‌است و مفهوم استفاده از الگوهای طراحی برای توصیف نحوه طراحی انعطاف‌پذیر و قابل استفاده مجدد شی گرا در نرم‌افزار را محبوب ساخت. هدف از الگوی راهبردگزین، جداکردن الگوریتم‌ها از مصرف‌کننده تا بتوان الگوریتم‌ها را بدون تغییر مایانای افزوده یا تغییر داد.

## نمونه‌ای از کدها
یک نمونهٔ ساده با استفاده از زبان برنامه‌نویسیِ پایتون:
```python3
from abc import ABC, abstractmethod

class Strategy(ABC):
    @abstractmethod
    def execute(self, data):
        pass

class StrategyA(Strategy):
    def execute(self, data):
        # simple ascending sort
        return sorted(data)

class StrategyB(Strategy):
    def execute(self, data):
        # descending sort
        return list(reversed(sorted(data)))

class Context:
    def __init__(self, strategy: Strategy):
        self._strategy = strategy

    @property
    def strategy(self):
        return self._strategy

    @strategy.setter
    def strategy(self, strategy: Strategy):
        self._strategy = strategy

    def do_work(self, data):
        result = self._strategy.execute(data)
        print(",".join(result))

# Usage
data = ["a", "c", "b"]
ctx = Context(StrategyA())
ctx.do_work(data)        # ascending
ctx.strategy = StrategyB()
ctx.do_work(data)        # descending
```


همچنین یک نمونهٔ دیگر با زبان تایپ‌اسکریپت:
```typescript
// Strategy interface
interface Strategy {
  execute(data: string[]): string[];
}

// Concrete strategies
class AscendingStrategy implements Strategy {
  execute(data: string[]): string[] {
    return [...data].sort();
  }
}

class DescendingStrategy implements Strategy {
  execute(data: string[]): string[] {
    return [...data].sort().reverse();
  }
}

// Context
class Context {
  private strategy: Strategy;

  constructor(strategy: Strategy) {
    this.strategy = strategy;
  }

  setStrategy(strategy: Strategy) {
    this.strategy = strategy;
  }

  execute(data: string[]) {
    const result = this.strategy.execute(data);
    console.log(result.join(','));
  }
}

// Usage
const data = ['a', 'c', 'b'];
const ctx = new Context(new AscendingStrategy());
ctx.execute(data);         // ascending
ctx.setStrategy(new DescendingStrategy());
ctx.execute(data);         // descending
```


## نمودارِ کلاس
[هیچ|بندانگشتی|256x256پیکسل|الگوی استراتژی در [زبان مدل‌سازی یکپارچه|UML]]

## جستارهای وابسته
* تزریق نیازمندی
* تابع مرتبه‌بالا
* Entity-component-system

## منابع

رده:الگوهای طراحی نرم‌افزار